理解會話中的Cookie和Session對象


會話可以簡單理解為:用戶打開一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然后關閉瀏覽器,整個過程稱之為一個會話。

在java語言中,Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求,其中這個過程,保存會話中數據的兩種重要技術:

1.Cookie技術:

Cookie是客戶端技術,服務器把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器,並保存在客戶端瀏覽器的緩存中。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據去。這樣,web資源處理的就是用戶各自的數據了。

2.Session技術:

Session是服務器端技術,利用這個技術,服務器在運行時可以為每一個用戶的瀏覽器創建一個其獨享的session對象,由於session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據為用戶服務。

一.HttpSession原理

Cookie和Session都能維護web客戶端和web服務端的會話。

1.  什么是HttpSession

   1)  HttpSession屬於服務端技術;

   2)  在Servlet中,產生唯一的會話,必須通過request.getSession()才行,重新打開新的IE,會產生新的Session會話;

   3)  在轉發和重定向的情況下,多個Servlet中共享同一個HttpSession;

   4)  同一個代碼request.getSession(),但可能含義不同,其一是代表創建新的會話,其二是取得原有的會話;

2.  HttpSession原理

   1)  會話底層是基於Cookie的;

   2)  客戶端發送請求頭:Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E

   3)  服務端發送響應頭:Set-Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E; Path=/day08

因此,對於會話而言,通過JSESSIONID來維護客戶端和服務端的狀態;

   4)  通過手工向客戶端寫入Cookie來達到多個瀏覽器共享會話的情況;

   5)  確保瀏覽器能禁止Cookie成功,當Cookie被禁用,可以使用URL重寫來維護客戶端和服務端的狀態;

   6)  會話在服務端默認有效期為30分鍾;

   7)  如果有這樣的錯誤:Session already invalidated:

則表示在無效的會話中取值,此時會話並沒有銷毀,只是內容被清空而已;

   8)  當瀏覽器阻止Cookie寫入瀏覽器,可以使用URL重寫;

二.HttpSession如何銷毀

  1. 在web.xml文件中配置過期時間,單位為分,Cookie生命周期時間單位是:秒;
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>
</web-app>

    2.   通過HttpSession.invalidate()將當前會話設置為無效;

    3.   web服務器shutdown時,即銷毀HttpSession;

    4.   重新部署新的web應用。

   注意:關閉瀏覽器,在默認情況下,會話不會銷毀。

三.Cookie細節

  1. 一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(Nme)和設置值(Value);
  2. 一個web站點可以給一個web瀏覽器發送多個Cookie,一個web瀏覽器也可以存儲多個web站點提供的Cookie;
  3. 瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB;
  4. 如果創建了一個Cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的Cookie,即存放在瀏覽器的緩存中,而當用戶退出瀏覽器后被刪除。

   注意:刪除Cookie時,path必須一致,否則不會刪除。

四.HttpSession細節

1.ssion對象被銷毀之后,不能在會話中取其內容

    代碼:

      session.invalidate();

//session.getAttribute("")此操作無效,不允許

五.亂碼問題

  1. 在Servlet中,以字節方式輸出給瀏覽器時:

ServletOutputStream以本地平台方法自動編碼和解碼,以解決中文輸出問題,即用戶不需要設置編碼方法,ServletOutputStream已解決。

代碼如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletOutputStream sout = response.getOutputStream();
        sout.write("你好!".getBytes());

或者,用戶可以自定義編碼和解碼方式,也可以解決中文輸出問題。

代碼如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        ServletOutputStream sout = response.getOutputStream();
        sout.write("大家好!".getBytes("UTF-8"));    }

       2.   在Servlet中,以字符方式輸出給瀏覽器時:需要在Servlet代碼中設置服務端的編碼方式和客戶端的編碼方式一致。

代碼如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //以字符方式輸出中文
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        pw.write("你好!大家好!");
    }

六.什么樣的場景下選用不同的域對象

  1. 在多個動態web資源中共享信息時,想到使用域對象;
  2. Context:信息是屬於每個客戶端共享的,例如訪問次序;
  3. Session:信息是屬於每個客戶端獨享的,例如購物車,用戶登錄;
  4. request:信息是屬於一次性的內容,例如錯誤信息,項目中優先使用; 

七.Get 和 Post 請求時的轉發和重定向

  1. 轉發問題:

     1)  在doGet()方法下進行轉發時,則轉發到的頁面代碼是doGet()方法下執行的代碼;

     2)  在doPost()方法下進行轉發時,則轉發到的頁面代碼是doPost()方法下執行的代碼;

     2.   重定向問題:

    1)  在doGet()方法下進行重定向時,則重定向到的頁面代碼是doGet()方法下執行的代碼,因為重定向后是由客戶端瀏覽器從新以request()的Get請求頭方式請求;

八.會話對象常用的AIP

  1. Cookie對象
Cookie cookie = new Cookie("name","xiaoming");
        System.out.println(cookie.getName());//輸出name
        System.out.println(cookie.getValue());//輸出name對應的值,即xiaoming
        cookie.setMaxAge(60);//設定這個cookie的最長存活時期,單位:秒
        int time = cookie.getMaxAge();//返回這個cookie指定的最長存活時期

     2.   Session對象

//有兩層含義,其一是創建新的session會話,其二是得到該web客戶端對應的會話
HttpSession session = request.getSession();
session.getId()//獲取session的ID
session.isNew()//判斷其是否新舊
session.setAttribute("name", "xiaoming");//綁定域中的信息
String name = (String)session.getAttribute("name");//獲取域中指定綁定的信息
Long time = session.getLastAccessedTime();//獲取會話最后的請求時間
session.invalidate()//終止這個session。所有綁定在這個session上的數據都會被清除。

 


免責聲明!

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



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