理解會話中的Cookie和Session對象

會話能夠簡單理解爲:用戶打開一個瀏覽器,點擊多個超連接,訪問服務器多個web資源,而後關閉瀏覽器,整個過程稱之爲一個會話。html

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

1.Cookie技術:web

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

2.Session技術:緩存

Session是服務器端技術,利用這個技術,服務器在運行時能夠爲每個用戶的瀏覽器建立一個其獨享的session對象,因爲session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時,能夠把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據爲用戶服務。服務器

一.HttpSession原理cookie

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

1.  什麼是HttpSessionapp

   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上的數據都會被清除。
相關文章
相關標籤/搜索