java基礎79 會話管理(Cookie技術、Session技術)

一、概念

    會話管理:管理瀏覽器和服務器之間會話過程當中產生的會話數據。
    Cookie技術:會話數據保存到瀏覽器客戶端。存 編號/標記(id)
    Session技術:會話技術會保存到服務器端(內存)。 【存 具體值】html

二、Cookie技術(會話數據保存到瀏覽器客戶端)

2.一、Cookie的核心API

   一、服務器端建立cookie對象
        Cookie cookie=new Cookie(「name」,」value」);
   二、設置Cookie
        void setPath(java.lang.String uri)  
        void setMaxAge(int expiry)  
        void setValue(java.lang.String newValue)
   三、把cookie發送給瀏覽器端;
        Response.addCookie(cookie);
   四、 瀏覽器帶着cookie信息訪問服務器(經過請求頭:)
       Cookie[] cookies=request.getCookies(); //服務器接收cookie數據
 侷限:
    一、只能保存字符串數據,不能保存中文
    二、一個cookie不能超過4kbjava

2.二、Cookie原理

   1)服務器建立cookie對象,把會話數據存儲到cookie對象中
        New Cookie(「name」,」value」);
   2)服務器發送cookie到瀏覽器
        Response.addCookie(cookie);
   3)瀏覽器獲得服務器發送的cookie,而後在保存到瀏覽器端
        Cookie:name=rose(隱藏帶着叫cookie名稱的請求頭)
   4)服務器接收到瀏覽器帶來的cookie信息
        Request.getCookies();web

2.三、Cookie的細節

    1)SetPath:設置cookie的有效路徑。有效路徑指保存到哪裏,那麼瀏覽器在有效的路徑下方訪問是就帶有cookie信息,不然就不帶。
    2)setMaxAge(int time):設置cookie的有效時間。
        正整數:表示cookie]數據保存到瀏覽器的緩衝目錄(硬盤中),數值表示保存的時間。
        負整數:表示cookie保存瀏覽器的內存中,瀏覽器關閉cookie就丟失。
               零:表示刪除同名的cookie數據
    3)cookie數據類型值能保存非中文的數據類型。能夠保存cookie,可是瀏覽器通常只容許放300個cookie,每一個站點最多隻能放20個Cookie,每一個cookie的大小限制4Kb瀏覽器

2.四、實例

例1緩存

 1 package com.shore.cookie;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.Cookie;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 /*
12  * 第一個cookie的程序
13  * */
14 public class CookieDemo1 extends HttpServlet {
15     
16     public void doGet(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18                 
19         /*request.setAttribute("name","hello");
20         request.getRequestDispatcher("GetData").forward(request, response);*/
21         //建立Cookie對象
22         Cookie cookie1=new Cookie("name","rose");
23         //Cookie cookie2=new Cookie("email","1314@qq.com");
24         /*
25          * 1)設置Cookie的有效路徑:默認狀況下,有效路徑在當前的web應用下./MyCookie
26          * cookie.setPath("/MyCookie")
27          * */
28         //cookie1.setPath("/MyCookie2");
29         //response.addCookie(cookie2);
30         /*
31          * 2)設置cookie的有效時間
32          * 正數:表示cookie保存到瀏覽器的緩存目錄(硬盤中),數值表示保存時間
33          * 負整數:表示cookie數據保存瀏覽器的內存中.瀏覽器關閉cookie就失效!!
34          * 零:表示刪除同名的cookie數據
35          * */
36         cookie1.setMaxAge(100);
37         //cookie2.setMaxAge(30);//5秒  從最後步調用cookie開始計算的
38         //cookie1.setMaxAge(-1);
39         response.addCookie(cookie1);
40         Cookie[] cookies=request.getCookies();
41         if(cookies!=null){
42             for (Cookie c : cookies) {
43                 String name=c.getName();
44                 String value=c.getValue();
45                 System.out.println("name="+name+";value="+value);
46             }
47         }else{
48             System.out.println("沒有接收到cookie數據");
49         }
50     }
51 }

例2服務器

 1 package com.shore.cookie;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class GetData extends HttpServlet {
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response)
14             throws ServletException, IOException {
15         /*String name=(String)request.getAttribute("name");
16         System.out.println(name);*/
17         Cookie[] cookies=request.getCookies();
18         /*if(cookies!=null){
19         for (Cookie c : cookies) {
20             String name=c.getName();
21             String value=c.getValue();
22             System.out.println("name="+name+";value="+value);
23         }
24         }else{
25             System.out.println("沒有接收到cookie數據");
26         }*/
27     }
28 }

例3cookie

 1 package com.shore.cookie;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class DeleteCookie extends HttpServlet {
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response)
14             throws ServletException, IOException {
15 
16         /*
17          * 需求:刪除Cookie
18          * */
19         Cookie cookie=new Cookie("name", "xxxx");
20         cookie.setMaxAge(0);//刪除同名cookie
21         response.addCookie(cookie);
22         System.out.println("刪除成功");
23     }
24 }

三、Session技術(會話數據保存到服務器端[內存])

3.1Session的核心API

    一、建立和獲得Session對象
        HttpSession session=Request.getSession(); //建立或者獲得Session對象
        Request.getSession(false); //獲得session對象
    二、會話數據保存Session對象中,和獲得會話數據
        Session.setAttribute(「name」,Object); //保存數據
        Session.getAttribute(「name」); //獲得數據
  注意:
      一、session.setMaxInactiveInterval(時間); //設置session過去時間
      二、session.invalidate(); //手動銷燬session對象session

3.二、session細節

    一、getId():獲得session編號
    二、兩個getSession方法
        1)getSession()/getSession(true):建立或獲得session對象。沒有匹配的session編號時,會自動建立新的session對象。
        2)getSession(false):獲得session對象。沒有匹配的session編號時,返回null。
   三、session對象銷燬的時間
       3.一、自動銷燬session對象
            1)默認狀況下,爲30分鐘,過期 瀏覽器會自動回收
            2)修改(設置)session的回收時間。
            3)全局修改
spa

          <!-- 修改session的全局有效時間:分鐘 -->
          <session-condig>
                  <session-timeout>時間數字</session-timeout>
          </session-condig>

      3.二、手動銷燬session對象
           1)直接調用invalidate();方法
3d

3.三、實例

SessionDemo1.java文件

 1 package com.shore.session;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpSession;
11 
12 /**
13  * @author DSHORE / 2018-9-9
14  *
15  */
16 public class SessionDemo1 extends HttpServlet {
17 
18     public void doGet(HttpServletRequest request, HttpServletResponse response)
19             throws ServletException, IOException {
20         
21         //建立session對象
22         HttpSession session=request.getSession();
23         //建立cookie對象
24         Cookie c=new Cookie("JSESSIONID",session.getId());//鍵值對
25         session.setMaxInactiveInterval(10); //設置Session的有效時間爲10秒
26         c.setMaxAge(60*60);//3600秒
27         response.addCookie(c);//把值添加到瀏覽器的cookie中
28         session.setAttribute("name","Jack");
29         System.out.println(session.getId()+"---->SessionDemo1的值");
30     }
31 }

SessionDemo2.java文件

 1 package com.shore.session;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.HttpSession;
10 
11 /**
12  * @author DSHORE / 2018-9-9
13  *
14  */
15 public class SessionDemo2 extends HttpServlet {
16 
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         
20         //建立session對象
21         HttpSession session=request.getSession(false);
22         if(session!=null){
23             String sessionName=(String)session.getAttribute("name");
24             System.out.println(sessionName);
25             System.out.println(session.getId());
26         }else{
27             System.out.println("id不對");
28         }
29     }
30 }

結果圖

       

實例解析:
一、第一次訪問建立的session對象時,給session對象分配一個惟一的id,叫JSESSIONID。
    HttpSession session=request.getSession();
二、把JSESSIONID做爲cookie的值發送給瀏覽器保存。
    Cookie c=new Cookie("JSESSIONID",session.getId());    
    response.addCookie(c);//把值添加到瀏覽器的cookie中
三、第二次訪問的時候,瀏覽器帶着JSESSIONID的cookie訪問服務器。
四、服務器獲得JSESSIONID,並在服務器的內存中搜索是否存在對應編號(id)的session對象。
    if(session!=null){
          String sessionName=(String)session.getAttribute("name");
          System.out.println(sessionName);
          System.out.println(session.getId());
    }else{
      System.out.println("id不對");
    }
五、若是找到對應編號的session對象,則直接返回該對象。
六、若是找不到對應編號的session對象,則建立新的session對象,循環第1到底6步(驟)。

結論:經過cookie(瀏覽器端的請求頭)中的JSESSIONID編號,去服務器中尋找session對象對應的值。

 

 

 

原創做者:DSHORE

做者主頁:http://www.cnblogs.com/dshore123/

原文出自:http://www.javashuo.com/article/p-xrczxyir-bn.html

歡迎轉載,轉載務必說明出處。(若是本文對您有幫助,能夠點擊一下右下角的 推薦,或評論,謝謝!

相關文章
相關標籤/搜索