JavaWeb之Servlet:Cookie 和 Session

會話

現實生活中咱們會用手機跟對方對話,拿起手機,撥號,而後對面接聽,跟着互相通話,最後會話結束。java

這個過程也能夠用咱們的B/S模式來描述:數組

 

           打開瀏覽器—>輸入地址->發出請求->服務器收到請求->向瀏覽器發出響應->..重複.->關閉瀏覽器瀏覽器

 

這樣的過程咱們用 「會話」 來描述,上面就一次會話的例子。緩存

 

會話管理

知道會話的概念後,咱們在平時上網是否能夠看到一些網頁有這樣的操做:當你是第一次登入這個網站,網站會發出:」歡迎來到本網站」。 然而,當你第二次登入該網站,它就會發出:」歡迎再次回來」。 爲何服務器會知道咱們已經登入過該頁面呢?無錯,就是在與服務器會話的過程當中產生了一些數據,而這些數據被保存下來,服務器根據這些數據來判斷你是否登錄過該頁面,而輸出不一樣歡迎標語。服務器

 

下面就來學習兩門會話信息管理技術:cookie

      Cookie技術會話數據保存在瀏覽器客戶端session

      Session技術:會話數據保存在服務器端。併發

 

Cookie技術

什麼是Cookie技術:

一種會話數據管理技術,該技術把會話數據保存在瀏覽器客戶端。ide

 

那麼Cookie技術的原理是什麼,它是如何工做的呢?

1)首先瀏覽器向服務器發出請求。學習

2)服務器就會根據須要生成一個Cookie對象,而且把數據保存在該對象內。

3)而後把該Cookie對象放在響應頭,一併發送回瀏覽器。

4)瀏覽器接收服務器響應後,提出該Cookie保存在瀏覽器端。

5)當下一次瀏覽器再次訪問那個服務器,就會把這個Cookie放在請求頭內一併發給服務器。

6)服務器從請求頭提取出該Cookie,判別裏面的數據,而後做出相應的動做。

 

 

Cookie的體驗

 

知道了Cookie的原理後,咱們就用它來實現一些功能吧~

 

從它的原理中,咱們知道Cookie是在服務器端建立的,那麼咱們在Servlet中建立一個Cookie對象吧:

 

public class cookieTest extends HttpServlet {

public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {

        Cookie cookie = new Cookie("name", "value");
    }

}

 

Cookie的構造方法接收兩個參數,第一個參數是該要傳遞的數據的名字,第二個是該數據的值。

而後咱們把這個Cookie加到響應頭,發送給瀏覽器吧~

 

Cookie cookie = new Cookie("name", "value");
        response.addCookie(cookie);

 

這樣一個Cookie就發送給瀏覽器了,咱們在瀏覽器看看發過來的響應頭:

 

有一個Set-Cookie的請求頭,它保存了咱們設置的信息。

而後咱們用瀏覽器再次訪問該Servlet,看看它的請求頭:

 

能夠看到,瀏覽器會把這個Cookie信息發過去服務器。

 

那麼服務器收到這個請求後,如何獲得該Cookie裏的數據呢?

咱們能夠這樣作:

Cookie cookie = new Cookie("name", "value");
        response.addCookie(cookie);
        
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for(Cookie c: cookies){
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+"="+value);
            }
        }else{
            System.out.println("沒有cookie信息");
        }

調用request.getCookies()方法,返回一個Cookie數組,而後遍歷它把裏面的內容取出來吧!

 

 

Cookie經常使用方法

 

1)建立Cookie對象

 

Cookie(java.lang.String name, java.lang.String value)

 

 

 

2)設置Cookie對象

 

setPath(java.lang.String uri)     --設置cookie的有效路徑,就是指定該Cookie訪問哪一個資源時會傳過去,訪問其餘資源則就不會傳。

 

setMaxAge(int expiry)             --設置cookie的有效時長,以秒爲單位

 

setValue(java.lang.String newValue)   --設置cookie的值

 

 

 

3)發送cookie信息到瀏覽器

 

response. addCookie(Cookie cookie)  

 

 

 

4)接收瀏覽器發送的cookie信息

 

  Cookie[] getCookies() 

 

 

Cookie細節

 

1)設置cookie的有效路徑: setPath(路徑) 。把cookie設置到某個路徑下,那麼瀏覽器在該路徑下訪問服務器時就會帶着cookie信息到服務器;不然,就不會帶着Cooke信息到服務器。

 

 

 

2)設置cookie的有效時長: setMaxAge(整數)。

 

正整數: 表示cookie數據保存在瀏覽器的緩存區中(硬盤中),以秒爲單位。例如,10: cookie10秒以後失效!

 

負整數: 表示cookie數據保存在瀏覽器的內存區中。關閉瀏覽器cookie就會失效!

 

零: 表示刪除同名的cookie數據

 

 

 

3)設置cookie的值: setValue()

 

 

 

4cookie保存的會話數據類型必須是字符串的。瀏覽器通常只容許存放300Cookie,每一個站點最多存放20Cookie,每一個Cookie的大小限制爲4KB

 

 

 

5cookie不適合保存敏感數據(例如密碼)

 

 

 Session技術

 

什麼是Session技術:

 

一種會話數據管理技術,該技術把會話數據保存在服務器端。

 

一樣都是會話數據管理技術,爲何咱們要發明Session技術呢?

 

 

咱們先分析一下Cookie的侷限性:

 

        1Cookie數據類型都是String,且容量有限制的。

 

        2Cookie不適合保存敏感數據

 

 

 

因此,Session技術能夠解決這兩種狀況。

 

 

 

 

 

那麼Session技術的原理是什麼,它是如何工做的呢?

 

1)瀏覽器發出請求到服務器。

 

2)服務器會根據需求生成Session對象,而且給這個Session對象一個編號,一個編號對應一個Session對象

 

3)服務器把須要記錄的數據封裝到這個Session對象裏,而後把這個Session對象保存下來。

 

4)服務器把這個Session對象的編號放到一個Cookie裏,隨着響應發送給瀏覽器

 

5)瀏覽器接收到這個cookie就會保存下來

 

6)當下一次瀏覽器再次請求該服務器服務,就會發送該Cookie

 

7)服務器獲得這個Cookie,取出它的內容,它的內容就是一個Session的編號!!!

 

8)憑藉這個Session編號找到對應的Session對象,而後利用該Session對象把保存的數據取出來!

 

 

 Session的體驗

下一面咱們就在Servlet內建立一個Session吧:

 

public class sessionTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        HttpSession session = request.getSession();
        session.setAttribute("name", "Rime");
    }
}

 

這樣當瀏覽器請求這個Servlet服務時,就會把這個session發過去啦~,咱們來看看服務器收到的響應頭吧!

 

能夠看到服務器給瀏覽器發出了一個 Set-Cookie 的響應頭,裏面有一個JSESSIONID!沒錯,這個就是Session的編號了!

而後咱們再次訪問這個Servlet吧!

 

瀏覽器會把保存這個JSESSIONID的cookie發送過去服務器~那麼服務器接收這個session編號,而後取出這個編號對應的數據吧!!

    //獲得數據
        String name = (String)session.getAttribute("name");
        
        System.out.println("name="+name);

而後看到輸出結果:

name=Rime

這樣就服務器就能夠根據這個name的值來根據須要作出一些動做了~

 

 SessionAPI

學習HttpSession

 

1)建立/獲得HttpSession對象

    HttpSession request.getSession()  

    HttpSession request.getSession(boolean create)  

2HttpSession做爲域對象保存會話數據

    void setAttribute(java.lang.String name, java.lang.Object value)  保存數據

    java.lang.Object getAttribute(java.lang.String name)     獲得數據

    void removeAttribute(java.lang.String name)  清除數據

3session細節:

    java.lang.String getId()  獲得session對象的編號

    void setMaxInactiveInterval(int interval)   設置session對象的有效時長

    void invalidate()      銷燬session對象

 

 

Session細節

 

1)獲得session編號: getId() 

 

 

2session對象生命週期:

 

  2.1 session對象什麼建立? 

 

      執行request.getSession()方法時

 

  2.2 session對象什麼銷燬?

 

      1)默認狀況下,session對象在30分鐘以後服務器自動銷燬。

 

      2)手動設置session有效時長

 

      void setMaxInactiveInterval(int interval) -以秒爲單位。

 

3)配置session的有效時長(統一配置)

 

4)手動銷燬

 

      void invalidate()

 

3getSession方法的使用

 

      getSession(true) / getSession() : 建立或獲得session對象。若是得不到session對象,建立 新的session對象。主要是用於建立session對象的。

 

      getSession(false)     :獲得session對象。若是得不到session對象,返回null。主要用於判斷是否能夠獲得session對象的。

 

4session編號的cookie過時時間:

 

      默認狀況下,cookie是在瀏覽器關閉時失效!!!

 

      修改cookie的有效時長:

 

      setMaxAge(正整數);

相關文章
相關標籤/搜索