菜鳥學JavaWeb之——Cookie、Session

七、Cookie

引入

會話:一次會話中包含多次請求和響應

  • 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開爲止
  • 功能:在一次的會話範圍內的多次請求間,共享數據
  • 方式:
    • 客戶端會話技術:Cookie(把數據存到客戶端)
    • 服務器端會話技術:Session(把數據存到服務器端)

7.1 Cookie

概念:客戶端會話技術,將數據保存到客戶端。即,瀏覽器第一次發送請求,服務器響應返回數據,瀏覽器會將這些數據保存到瀏覽器本地,在下一次請求時會帶上這些數據。

7.1.1 使用步驟:

  • 創建Cookie對象,綁定數據

    new Cookie(String name, String value)

  • 發送Cookie對象

    response.addCookie(Cookie cookie)

  • 獲取Cookie,拿到數據

    Cookie[] request.getCookies()

7.1.2 實現原理:

基於響應頭set-cookie和請求頭cookie實現

在這裏插入圖片描述

7.1.3 Cookie的細節:

  • 一次可不可以發送多個cookie?

    答:可以,可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可

  • cookie在瀏覽器中保存多長時間?

    答:默認情況下,當瀏覽器關閉後,Cookie數據就銷燬

    持久化存儲:setMaxAge(int seconds)

    • 參數爲正數:將Cookie數據寫到硬盤文件中。持久化存儲。cookie存活時間
    • 負數:默認值,瀏覽器關閉就銷燬
    • 零:刪除cookie信息
  • cookie能不能存中文?

    Tomcat8之前不能存中文,Tomcat8之後,cookie支持中文數據

  • cookie共享問題?

    1.假設在一個Tomcat服務器中,部署了多個web項目,那麼在這些web項目中cookie能不能共享?

    • 默認情況下cookie不能共享

    • setPath(String path):設置cookie的獲取範圍。默認情況下,設置當前的虛擬路徑

      如果要共享,則將path設置爲“/”(這樣就可以在同一服務器下的不同項目中共享了)

    2.不同的Tomcat服務器間cookie共享問題

    • setDomain(String path):如果設置一級域名相同,那麼多個服務器之間cookie可以共享

      setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookie可以共享

7.1.4 Cookie的特點和作用:

特點:

  • cookie存儲數據在客戶端瀏覽器(不安全)
  • 瀏覽器對於單個cookie的大小有限制(4kb)以及對同一個域名下的總cookie數量也有限制(20個)

作用:

  • cookie一般用於存儲少量的不太敏感的數據
  • 在不登錄的情況下,完成服務器對客戶端的身份識別

7.1.5 小練習:

訪問一個Servlet,如果是第一次訪問,則提示你好,歡迎首次訪問。如果不是第一次訪問,提示上次訪問時間

@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置響應的消息體的數據格式以及編碼
        response.setContentType("text/html;charset=utf-8");
        //1.獲取所有Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;
        if(cookies!=null) {
            for(Cookie c : cookies) {
                String name = c.getName();
                if("lastTime".equals(name)) {
                    flag = true;//有lastTime的cookie
                    //獲取Cookie的value,即時間
                    String value = c.getValue();
                    //URL解碼
                    value = URLDecoder.decode(value,"utf-8");
                    response.getWriter().println("歡迎回來,你上次訪問時間是" + value);

                    //設置Cookie的value
                    //獲取當前時間的字符串,重新設置Cookie的值,重新發送cookie
                    Date newDate = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date =sdf.format(newDate);
                    //URL編碼
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    c.setValue(str_date);
                    //設置cookie的存活時間
                    c.setMaxAge(60*60*24*30);//一個月
                    response.addCookie(c);

                    break;
                }
            }
        }
        if(cookies == null || flag == false || cookies.length == 0) {
            response.getWriter().println("歡迎您首次登錄");
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String format = sdf.format(date);
            format = URLEncoder.encode(format,"utf-8");
            Cookie cookie = new Cookie("lastTime",format);
            cookie.setMaxAge(60*60*24*30);
            response.addCookie(cookie);

        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

八、Session

8.1 概念

服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession

獲取HttpSession對象

HttpSession session = request.getSession();

使用HttpSession對象

  • Object getAttribute(String name)
  • void setAttribute(String name, Object value)
  • void removeAttribute(String name)

8.2 Session原理

  • Session的實現是依賴於Cookie的。

在這裏插入圖片描述

新建的Session對象會有一個唯一的ID,服務器給瀏覽器響應時會發送一個響應頭: Set-cookie:JSESSIONID=7456321456avcs2 。客戶端收到這個響應頭後會將這個Cookie存在瀏覽器內存,下次再訪問當前項目的其他資源時會通過請求頭攜帶着這個JSESSIONID,服務器得到這個cookie信息後會根據這個值在內存中查找有沒有id值爲7456321456avcs2 的session對象,找到後,request獲取的session就是Demo1創建的Session。

8.3 Session細節

  • 當客戶端關閉後,服務器不關閉,兩次獲取的Session是否是同一個?

    答:默認情況下不是的。

    如果需要相同,則可以創建Cookie,鍵爲JSESSIONID,設置最大存活時間,讓cookie持久化保存。

    @WebServlet("/sessionDemo1")
    public class SessionDemo1 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //獲取session
            HttpSession session = request.getSession();
    
            Cookie c = new Cookie("JSESSIONID",session.getId());
            c.setMaxAge(60*60);
            response.addCookie(c);
            System.out.println(session);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    }
    
  • 客戶端不關閉,服務器關閉後,兩次獲取的session是同一個嗎?

    答:不是同一個,但是要確保數據不丟失

    • session的鈍化

      在服務器正常關閉之前,將session對象系列化到硬盤上

    • session的活化

      在服務器啓動後,將session文件轉化爲內存中的session對象即可

    其實鈍化活化的過程會由Tomcat服務器來完成,不需要我們操心。只是IDE只能鈍化,不能活化。

  • session什麼時候被銷燬?

    • 服務器關閉後
    • session對象調用invalidate()
    • session默認失效時間:30分鐘

8.4 Session特點

  • session用於存儲一次會話的多次請求的數據,存在服務器端
  • session可以存儲任意類型,任意大小的數據

session和cookie的區別

  • session存儲數據在服務器端,cookie在客戶端
  • session沒有數據大小限制,cookie有
  • session數據安全,cookie相對於不安全

內容持續更新中…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章