六、Cookie與Session 今日內容

今日內容

1. 會話技術
    1. Cookie
    2. Session
2. JSP:入門學習

一、會話技術

  1. 會話:一次會話中包含多次請求和響應。
    • 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開爲止
  2. 功能:在一次會話的範圍內的多次請求間,共享數據
  3. 方式:
    ①客戶端會話技術:Cookie
    ②2. 服務器端會話技術:Session

二、 Cookie:

  1. 概念:客戶端會話技術,將數據保存到客戶端

  2. 快速入門:
    步驟:
    ①創建Cookie對象,綁定數據:new Cookie(String name, String value)
    ②發送Cookie對象:response.addCookie(Cookie cookie)
    ③獲取Cookie,拿到數據:Cookie[] request.getCookies()
    代碼:

    @WebServlet("/CookiewServletDemo1")
    public class CookiewServletDemo1 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie cookie = new Cookie("msg", "hello");
            response.addCookie(cookie);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    @WebServlet("/CookiewServletDemo2")
    public class CookiewServletDemo2 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //獲取cookie
            Cookie[] cookies = request.getCookies();
            if(cookies!=null) {
                for (Cookie cookie : cookies) {
                    System.out.println(cookie.getName()+":"+cookie.getValue());
                }
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
  3. 實現原理
    基於響應頭set-cookie和請求頭cookie實現

  4. cookie的細節
    ①一次可不可以發送多個cookie?
    可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可。
    ②cookie在瀏覽器中保存多長時間?
    (1)默認情況下,當瀏覽器關閉後,Cookie數據被銷燬
    (2)持久化存儲:setMaxAge(int seconds)

    1. 正數:將Cookie數據寫到硬盤的文件中。持久化存儲。並指定cookie存活時間,時間到後,cookie文件自動失效
    2. 負數:默認值
    3. 零:刪除cookie信息
    

③cookie能不能存中文?
* 在tomcat 8 之前 cookie中不能直接存儲中文數據。
* 需要將中文數據轉碼---一般採用URL編碼(%E3)
* 在tomcat 8 之後,cookie支持中文數據。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析
④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可以共享
  1. Cookie的特點和作用

    1. cookie存儲數據在客戶端瀏覽器

      1. 瀏覽器對於單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20個)
      • 作用:
        1. cookie一般用於存出少量的不太敏感的數據
        2. 在不登錄的情況下,完成服務器對客戶端的身份識別
  2. 案例:記住上一次訪問時間

    1. 需求:

      1. 訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問。

        1. 如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串
      2. 分析:

        1. 可以採用Cookie來完成
        2. 在服務器中的Servlet判斷是否有一個名爲lastTime的cookie
          1. 有:不是第一次訪問
            1. 響應數據:歡迎回來,您上次訪問時間爲:2018年6月10日11:50:20
            2. 寫回Cookie:lastTime=2018年6月10日11:50:01
          2. 沒有:是第一次訪問
            1. 響應數據:您好,歡迎您首次訪問
            2. 寫回Cookie:lastTime=2018年6月10日11:50:01
      3. 代碼實現:
        package cn.itcast.cookie;

        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.Cookie;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        import java.net.URLDecoder;
        import java.net.URLEncoder;
        import java.text.SimpleDateFormat;
        import java.util.Date;

    @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;//沒有cookie爲lastTime
            //2.遍歷cookie數組
            if(cookies != null && cookies.length > 0){
                for (Cookie cookie : cookies) {
                    //3.獲取cookie的名稱
                    String name = cookie.getName();
                    //4.判斷名稱是否是:lastTime
                    if("lastTime".equals(name)){
                        //有該Cookie,不是第一次訪問
    
                        flag = true;//有lastTime的cookie
    
                        //設置Cookie的value
                        //獲取當前時間的字符串,重新設置Cookie的值,重新發送cookie
                        Date date  = new Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                        String str_date = sdf.format(date);
                        System.out.println("編碼前:"+str_date);
                        //URL編碼
                        str_date = URLEncoder.encode(str_date,"utf-8");
                        System.out.println("編碼後:"+str_date);
                        cookie.setValue(str_date);
                        //設置cookie的存活時間
                        cookie.setMaxAge(60 * 60 * 24 * 30);//一個月
                        response.addCookie(cookie);


    
                        //響應數據
                        //獲取Cookie的value,時間
                        String value = cookie.getValue();
                        System.out.println("解碼前:"+value);
                        //URL解碼:
                        value = URLDecoder.decode(value,"utf-8");
                        System.out.println("解碼後:"+value);
                        response.getWriter().write("<h1>歡迎回來,您上次訪問時間爲:"+value+"</h1>");
    
                        break;
    

                    }
                }
            }


    
            if(cookies == null || cookies.length == 0 || flag == false){
                //沒有,第一次訪問
    
                //設置Cookie的value
                //獲取當前時間的字符串,重新設置Cookie的值,重新發送cookie
                Date date  = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                String str_date = sdf.format(date);
                System.out.println("編碼前:"+str_date);
                //URL編碼
                str_date = URLEncoder.encode(str_date,"utf-8");
                System.out.println("編碼後:"+str_date);
    

                Cookie cookie = new Cookie("lastTime",str_date);
                //設置cookie的存活時間
                cookie.setMaxAge(60 * 60 * 24 * 30);//一個月
                response.addCookie(cookie);
    
                response.getWriter().write("<h1>您好,歡迎您首次訪問</h1>");
            }


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

JSP:入門學習

  1. 概念:
    • Java Server Pages: java服務器端頁面
      • 可以理解爲:一個特殊的頁面,其中既可以指定定義html標籤,又可以定義java代碼
        • 用於簡化書寫!!!
  1. 原理

    • JSP本質上就是一個Servlet
  2. JSP的腳本:JSP定義Java代碼的方式

    1. <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什麼,該腳本中就可以定義什麼。
      1. <%! 代碼 %>:定義的java代碼,在jsp轉換後的java類的成員位置。
      2. <%= 代碼 %>:定義的java代碼,會輸出到頁面上。輸出語句中可以定義什麼,該腳本中就可以定義什麼。
  1. JSP的內置對象:

    • 在jsp頁面中不需要獲取和創建,可以直接使用的對象
      • jsp一共有9個內置對象。
      • 今天學習3個:
        • request
        • response
        • out:字符輸出流對象。可以將數據輸出到頁面上。和response.getWriter()類似
          • response.getWriter()和out.write()的區別:
            • 在tomcat服務器真正給客戶端做出響應之前,會先找response緩衝區數據,再找out緩衝區數據。
            • response.getWriter()數據輸出永遠在out.write()之前
  2. 案例:改造Cookie案例

Session:主菜

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

  2. 快速入門:

    1. 獲取HttpSession對象:
      HttpSession session = request.getSession();
      1. 使用HttpSession對象:
        Object getAttribute(String name)
        void setAttribute(String name, Object value)
        void removeAttribute(String name)
  3. 原理

    • Session的實現是依賴於Cookie的。
  1. 細節:

    1. 當客戶端關閉後,服務器不關閉,兩次獲取session是否爲同一個?

      • 默認情況下。不是。
        • 如果需要相同,則可以創建Cookie,鍵爲JSESSIONID,設置最大存活時間,讓cookie持久化保存。
          Cookie c = new Cookie("JSESSIONID",session.getId());
          c.setMaxAge(60*60);
          response.addCookie(c);
      1. 客戶端不關閉,服務器關閉後,兩次獲取的session是同一個嗎?

        • 不是同一個,但是要確保數據不丟失。tomcat自動完成以下工作
          • session的鈍化:
            • 在服務器正常關閉之前,將session對象系列化到硬盤上
          • session的活化:
            • 在服務器啓動後,將session文件轉化爲內存中的session對象即可。
      2. session什麼時候被銷燬?

        1. 服務器關閉
        2. session對象調用invalidate() 。
        3. session默認失效時間 30分鐘
          選擇性配置修改
          <session-config>
          <session-timeout>30</session-timeout>
          </session-config>
  2. session的特點

    1. session用於存儲一次會話的多次請求的數據,存在服務器端

      1. session可以存儲任意類型,任意大小的數據
      • session與Cookie的區別:
        1. session存儲數據在服務器端,Cookie在客戶端
        2. session沒有數據大小限制,Cookie有
        3. session數據安全,Cookie相對於不安全

案例:驗證碼

  1. 案例需求:
    1. 訪問帶有驗證碼的登錄頁面login.jsp
      1. 用戶輸入用戶名,密碼以及驗證碼。
        • 如果用戶名和密碼輸入有誤,跳轉登錄頁面,提示:用戶名或密碼錯誤
        • 如果驗證碼輸入有誤,跳轉登錄頁面,提示:驗證碼錯誤
        • 如果全部輸入正確,則跳轉到主頁success.jsp,顯示:用戶名,歡迎您
  1. 分析:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章