JavaWeb之Servlet:Cookie 和 Session


會話

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

這個過程也可以用我們的B/S模式來描述:

 

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

 

這樣的過程我們用 “會話” 來描述,上面就一次會話的例子。

 

會話管理

知道會話的概念后,我們在平時上網是否可以看到一些網頁有這樣的操作:當你是第一次登入這個網站,網站會發出:”歡迎來到本網站”。 然而,當你第二次登入該網站,它就會發出:”歡迎再次回來”。 為什么服務器會知道我們已經登入過該頁面呢?無錯,就是在與服務器會話的過程中產生了一些數據,而這些數據被保存下來,服務器根據這些數據來判斷你是否登陸過該頁面,而輸出不同歡迎標語。

 

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

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

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

 

Cookie技術

什么是Cookie技術:

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

 

那么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(正整數);

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM