1. 程式人生 > 實用技巧 >Cookie 和 Session

Cookie 和 Session

一、會話機制

    Web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。

    一次會話指的是:就好比打電話,A給B打電話,接通之後,會話開始,直到結束通話電話,該次會話就結束了,而瀏覽器訪問伺服器,就跟打電話一樣,瀏覽器A給伺服器傳送請求,訪問web程式,該次會話就已經接通,其中不管瀏覽器傳送多少請求(就相當於接通電話後說話一樣),都視為一次會話,直到瀏覽器關閉,本次會話結束。其中注意,一個瀏覽器就相當於一部電話,如果使用火狐瀏覽器,訪問伺服器,就是一次會話了,然後開啟google瀏覽器,訪問伺服器,這是另一個會話,雖然是在同一臺電腦,同一個使用者在訪問,但是,這是兩次不同的會話。

    知道了什麼是會話後,思考一個問題,一個瀏覽器訪問一個伺服器就能建立一個會話,如果別的電腦,都同時訪問該伺服器,就會建立很多會話,就拿一些購物網站來說,我們訪問一個購物網站的伺服器,會話就被建立了,然後就點選瀏覽商品,對感興趣的商品就先加入購物車,等待一起付賬,這看起來是很普通的操作,但是想一下,如果有很多別的電腦上的瀏覽器同時也在訪問該購物網站的伺服器,跟我們做類似的操作呢?伺服器又是怎麼記住使用者,怎麼知道使用者A購買的任何商品都應該放在A的購物車內,不論是使用者A什麼時間購買的,不能放入使用者B或使用者C的購物車內的呢?所以就有了cookie和session這兩個技術,就像第一行說的那樣,cookie和session用來跟蹤使用者的整個會話,

Cookie和Session之間的區別和聯絡

      假如一個咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:

      1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支援狀態。但是http協議本身是無狀態的

      2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯絡起來。這種做法就是在客戶端保持狀態。也就是cookie。 顧客就相當於瀏覽器,cookie如何工作,下面會詳細講解

      3、發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄新增一些消費資訊。這種做法就是在伺服器端保持狀態。

      由於HTTP協議是無狀態的,而出於種種考慮也不希望使之成為有狀態的,因此,後面兩種方案就成為現實的選擇。具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制可能需要藉助於cookie機制來達到儲存標識的目的,但實際上它還有其他選擇

二、Cookie

1、Cookie 翻譯過來是餅乾的意思。
2、Cookie 是伺服器通知客戶端儲存鍵值對的一種技術。
3、客戶端有了 Cookie 後,每次請求都發送給伺服器。
4、每個 Cookie 的大小不能超過 4kb

上面已經介紹了為什麼要使用Cookie,以及Cookie的一些特點,比如儲存在客戶端,用來記錄使用者身份資訊的,現在來看看如何使用Cookie。

     藉著上面會員卡的例子來說,採用的是第二種方案,其中還需要解決的問題就是:如何分發會員卡,會員卡的內容,客戶如何使用會員卡,會員卡的有效日期,會員卡的使用範圍

1、如何分發會員卡、會員卡的內容:也就是cookie是如何建立的?建立後如何傳送給客戶端?

        由伺服器進行建立,也就相當於咖啡店來建立會員卡,在建立會員卡的同時,就會將會員卡中的內容也給設定了

          Cookie cookie = new Cookie(key,value);  //以鍵值對的方式存放內容,

          response.addCookie(cookie);  //傳送回瀏覽器端

        注意:一旦cookie建立好了,就不能在往其中增加別的鍵值對,但是可以修改其中的內容,

          cookie.setValue();  //將key對應的value值修改

2、客戶如何使用會員卡,cookie在客戶端是如何工作的,工作原理是什麼?

這個過程就相當於,咖啡店建立好了會員卡,並且已經設定了其中的內容,交到了客戶手中,下次客戶過來時,就帶著會員卡過來,就知道你是會員了,然後咖啡店就拿到你的會員卡對其進行操作。

Servlet 程式中的程式碼:

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
//1 建立 Cookie 物件
Cookie cookie = new Cookie("key4", "value4");
//2 通知客戶端儲存 Cookie
resp.addCookie(cookie);
//1 建立 Cookie 物件
Cookie cookie1 = new Cookie("key5", "value5");
//2 通知客戶端儲存 Cookie
resp.addCookie(cookie1);
resp.getWriter().write("Cookie 建立成功");
}

伺服器如何獲取 Cookie

伺服器獲取客戶端的 Cookie 只需要一行程式碼:req.getCookies():Cookie[]

Cookie 的工具類:

public class CookieUtils {
/**
* 查詢指定名稱的 Cookie 物件
* @param name
* @param cookies
* @return
*/
public static Cookie findCookie(String name , Cookie[] cookies){
if (name == null || cookies == null || cookies.length == 0) {
return null;
}
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())) {
return cookie;
}
}
return null;
}
}

Servlet 程式中的程式碼:

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
// getName 方法返回 Cookie 的 key(名)
// getValue 方法返回 Cookie 的 value 值
resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
}
Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
// for (Cookie cookie : cookies) {
// if ("key2".equals(cookie.getName())) {
// iWantCookie = cookie;
// break;
// }
// }
// 如果不等於 null,說明賦過值,也就是找到了需要的 Cookie
if (iWantCookie != null) {
resp.getWriter().write("找到了需要的 Cookie");
}
}

Cookie 值的修改

方案一:
1、先建立一個要修改的同名(指的就是 key)的 Cookie 物件
2、在構造器,同時賦於新的 Cookie 值。
3、呼叫 response.addCookie( Cookie );

// 方案一:
// 1、先建立一個要修改的同名的 Cookie 物件
// 2、在構造器,同時賦於新的 Cookie 值。
Cookie cookie = new Cookie("key1","newValue1");
// 3、呼叫 response.addCookie( Cookie ); 通知 客戶端 儲存修改
resp.addCookie(cookie);

方案二:
1、先查詢到需要修改的 Cookie 物件
2、呼叫 setValue()方法賦於新的 Cookie 值。
3、呼叫 response.addCookie()通知客戶端儲存修改

// 方案二:
// 1、先查詢到需要修改的 Cookie 物件
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {
// 2、呼叫 setValue()方法賦於新的 Cookie 值。
cookie.setValue("newValue2");
// 3、呼叫 response.addCookie()通知客戶端儲存修改
resp.addCookie(cookie);
}

瀏覽器檢視 Cookie:

谷歌瀏覽器如何檢視 Cookie:

火狐瀏覽器如何檢視 Cookie:

會員卡的有效日期?也就是cookie生命控制

Cookie 的生命控制指的是如何管理 Cookie 什麼時候被銷燬(刪除) 這個可以自由設定,預設是關閉瀏覽器,cookie就沒用了。

cookie.setMaxAge(expiry);  //設定cookie被瀏覽器儲存的時間。

          expiry:單位秒,預設為-1,

            expiry=-1:代表瀏覽器關閉後,也就是會話結束後,cookie就失效了,也就沒有了。

             expiry>0:代表瀏覽器關閉後,cookie不會失效,仍然存在。並且會將cookie儲存到硬碟中,直到設定時間過期才會被瀏覽器自動刪除,

            expiry=0:刪除cookie。不管是之前的expiry=-1還是expiry>0,當設定expiry=0時,cookie都會被瀏覽器給刪除。

/**
* 設定存活 1 個小時的 Cooie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
Cookie cookie = new Cookie("life3600", "life3600");
cookie.setMaxAge(60 * 60); // 設定 Cookie 一小時之後被刪除。無效
resp.addCookie(cookie);
resp.getWriter().write("已經建立了一個存活一小時的 Cookie");
}
/**
* 馬上刪除一個 Cookie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 先找到你要刪除的 Cookie 物件
Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
if (cookie != null) {
// 呼叫 setMaxAge(0);
cookie.setMaxAge(0); // 表示馬上刪除,都不需要等待瀏覽器關閉
// 呼叫 response.addCookie(cookie);
resp.addCookie(cookie);
resp.getWriter().write("key4 的 Cookie 已經被刪除");
}
}
/**
* 預設的會話級別的 Cookie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
Cookie cookie = new Cookie("defalutLife","defaultLife");
cookie.setMaxAge(-1);//設定存活時間
resp.addCookie(cookie);
}

會員卡的使用範圍? Cookie 有效路徑 Path 的設定

比如星巴克在北京有一個分店,在上海也有一個分店,我們只是在北京的星巴克辦理了會員卡,那麼當我們到上海時,就不能使用該會員卡進行打折優惠了。而cookie也是如此,可以設定伺服器端獲取cookie的訪問路徑,而並非在伺服器端的web專案中所有的servlet都能訪問該cookie。

cookie預設路徑:當前訪問的servlet父路徑。

        例如:http://localhost:8080/test01/a/b/c/SendCookieServlet

          預設路徑:/test01/a/b/c  也就是說,在該預設路徑下的所有Servlet都能夠獲取到cookie,/test01/a/b/c/MyServlet 這個MyServlet就能獲取到cookie。

      修改cookie的訪問路徑

        setPath("/");  //在該伺服器下,任何專案,任何位置都能獲取到cookie,

          通途:保證在tomcat下所有的web專案可以共享相同的cookie

       例如:tieba , wenku , beike 多個專案共享資料。例如使用者名稱。

        setPath("/test01/");  //在test01專案下任何位置都能獲取到cookie。

Cookie 的 path 屬性可以有效的過濾哪些 Cookie 可以傳送給伺服器。哪些不發。
path 屬性是通過請求的地址來進行有效的過濾。
CookieA path=/工程路徑
CookieB path=/工程路徑/abc
請求地址如下:
http://ip:port/工程路徑/a.html
CookieA 傳送
CookieB 不傳送
http://ip:port/工程路徑/abc/a.html
CookieA 傳送
CookieB 傳送

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
Cookie cookie = new Cookie("path1", "path1");
// getContextPath() ===>>>> 得到工程路徑
cookie.setPath( req.getContextPath() + "/abc" ); // ===>>>> /工程路徑/abc
resp.addCookie(cookie);
resp.getWriter().write("建立了一個帶有 Path 路徑的 Cookie");
}

5、總結Cookie:

        工作流程:

          1. servlet建立cookie,儲存少量資料,傳送瀏覽器。

         2. 瀏覽器獲得伺服器傳送的cookie資料,將自動的儲存到瀏覽器端。

            3. 下次訪問時,瀏覽器將自動攜帶cookie資料傳送給伺服器。

        cookie操作

          1.建立cookie:new Cookie(name,value)

         2.傳送cookie到瀏覽器:HttpServletResponse.addCookie(Cookie)

          3.servlet接收cookie:HttpServletRequest.getCookies() 瀏覽器傳送的所有cookie

         cookie特點

          1. 每一個cookie檔案大小:4kb , 如果超過4kb瀏覽器不識別

          2. 一個web站點(web專案):傳送20個

            3.一個瀏覽器儲存總大小:300個

            4.cookie 不安全,可能洩露使用者資訊。瀏覽器支援禁用cookie操作。

          5. 預設情況生命週期:與瀏覽器會話一樣,當瀏覽器關閉時cookie銷燬的。---臨時cookie

        cookie api

          getName() 獲得名稱,cookie中的key

          getValue() 獲得值,cookie中的value

          setValue(java.lang.String newValue) 設定內容,用於修改key對應的value值。

          setMaxAge(int expiry) 設定有效時間【】

          setPath(java.lang.String uri) 設定路徑【】  

          setDomain(java.lang.String pattern) 設定域名 , 一般無效,有瀏覽器自動設定,setDomain(".itheima.com")

             www.itheima.com / bbs.itheima.com 都可以訪問

             a.b.itheima.com無法訪問

             作用:設定cookie的作用範圍,域名+路徑在一起就構成了cookie的作用範圍,上面單獨設定的setPath有用,是因為有瀏覽器自動設定該域名屬性,但是我們必須知道有這麼個屬性進行域名設定的

          isHttpOnly() 是否只是http協議使用。只能servlet的通過getCookies()獲得,javascript不能獲得。

          setComment(java.lang.String purpose) (瞭解)  //對該cookie進行描述的資訊(說明作用),瀏覽器顯示cookie資訊時能看到

          setSecure(boolean flag) (瞭解)  是否使用安全傳輸協議。為true時,只有當是https請求連線時cookie才會傳送給伺服器端,而http時不會,但是服務端還是可以傳送給瀏覽端的。

          setVersion(int v) (瞭解)  引數為0(傳統Netscape cookie規範編譯)或1(RFC 2109規範編譯)。這個沒用到,不是很懂

        注意:cookie不能傳送中文,如果要傳送中文,就需要進行特別處理。

          JDK提供工具,進行編碼

            URLEncoder:編碼

            URLDecoder:解碼

            //傳送cookie

            Cookie cookie = new Cookie(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));

            response.addCookie(cookie);

            //獲得cookie中文內容

            URLDecoder.decoder(request.getCookie().getName);  //獲取key

            URLDecoder.decoder(request.getCookie().getValue);  //獲取value  

     6.cookie案例

         6.1、記住使用者名稱

            登入時,在伺服器端獲取到使用者名稱,然後建立一個cookie,將使用者名稱存入cookie中,傳送回瀏覽器端,然後瀏覽器下次在訪問登入頁面時,先拿到cookie,將cookie中的資訊拿出來,看是否儲存了該使用者名稱,如果儲存了,那麼直接用他,如果沒有,則自己手寫使用者名稱。

6.2、歷史記錄

            比如購物網站,都會有我們的瀏覽記錄的,實現原理其實也是用cookie技術,每瀏覽一個商品,就將其存入cookie中,到需要顯示瀏覽記錄時,只需要將cookie拿出來遍歷即可。 

三、Session

     同樣,會員卡的例子的第三種方法,發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄新增一些消費資訊。這種做法就是在伺服器端保持狀態。 這就是session的用法,在伺服器端來保持狀態,儲存一些使用者資訊。

功能作用:伺服器用於共享資料技術,

什麼是 Session 會話?
1、Session 就一個介面(HttpSession)。
2、Session 就是會話。它是用來維護一個客戶端和伺服器之間關聯的一種技術
3、每個客戶端都有自己的一個 Session 會話。
4、Session 會話中,我們經常用來儲存使用者登入之後的資訊。

如何建立 Session 和獲取(id 號,是否為新)
如何建立和獲取 Session。它們的 API 是一樣的。
request.getSession()
第一次呼叫是:建立 Session 會話
之後呼叫都是:獲取前面建立好的 Session 會話物件。
isNew(); 判斷到底是不是剛創建出來的(新的)
true 表示剛建立
false 表示獲取之前建立
每個會話都有一個身份證號。也就是 ID 值。而且這個 ID 是唯一的。
getId() 得到 Session 的會話 id 值。

session原理分析:

        首先瀏覽器請求伺服器訪問web站點時,程式需要為客戶端的請求建立一個session的時候,伺服器首先會檢查這個客戶端請求是否已經包含了一個session標識、稱為JSESSIONID,如果已經包含了一個JSESSIONID則說明以前已經為此客戶端建立過session,伺服器就按照JSESSIONID把這個session檢索出來使用,如果客戶端請求不包含JSESSIONID,則伺服器為此客戶端建立一個session並且生成一個與此session相關聯的JSESSIONID,JSESSIONID 的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個JSESSIONID將在本次響應中返回到客戶端儲存,儲存這個JSESSIONID的方式就可以是cookie,這樣在互動的過程中,瀏覽器可以自動的按照規則把這個標識發回給伺服器,伺服器根據這個JSESSIONID就可以找得到對應的session,又回到了這段文字的開始。

獲取session:

        request.getSession();  //如果沒有將建立一個新的,等效getSession(true);

          有些人不理解,為什麼是通過request來獲取session,可以這樣理解,在獲取session時,需要檢測請求中是否有session標識,所以需要用request來獲取

        request.getSession(boolean);  //true:沒有將建立,false:沒有將返回null

     session屬性操作:

        xxxAttribute(...)

          用來存放一些資訊,然後才能共享資訊 

          setAttrubute(key,value);

          getAttribute(key);

/**
* 往 Session 中儲存資料
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
req.getSession().setAttribute("key1", "value1");
resp.getWriter().write("已經往 Session 中儲存了資料");
}
/**
* 獲取 Session 域中的資料
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("從 Session 中獲取出 key1 的資料是:" + attribute);
}

Session 生命週期控制

session生命週期

        常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程式通知伺服器刪除一個session,否則伺服器會一直保留,程式一般都是在使用者做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來儲存session id,而關閉瀏覽器後這個JSESSIONID就消失了,再次連線伺服器時也就無法找到原來的session。如果伺服器設定的cookie被儲存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的JSESSIONID傳送給伺服器,則再次開啟瀏覽器仍然能夠找到原來的session 

        恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設定了一個失效時間,一般是30分鐘,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省儲存空間

們也可以自己來控制session的有效時間

          session.invalidate()將session物件銷燬

          setMaxInactiveInterval(int interval) 設定有效時間,單位秒

          在web.xml中配置session的有效時間

            

              30 單位:分鐘

            

    

        所以,討論了這麼久,session的生命週期就是:

            建立:第一次呼叫getSession()

            銷燬:

               1、超時,預設30分鐘

               2、執行api:session.invalidate()將session物件銷燬、setMaxInactiveInterval(int interval) 設定有效時間,單位秒

               3、伺服器非正常關閉

                  自殺,直接將JVM馬上關閉

                  如果正常關閉,session就會被持久化(寫入到檔案中,因為session預設的超時時間為30分鐘,正常關閉後,就會將session持久化,等30分鐘後,就會被刪除)

位置: D:\java\tomcat\apache-tomcat-7.0.53\work\Catalina\localhost\test01\SESSIONS.ser

public void setMaxInactiveInterval(int interval) 設定 Session 的超時時間(以秒為單位),超過指定的時長,Session
就會被銷燬。
值為正數的時候,設定 Session 的超時時長。
負數表示永不超時(極少使用)
public int getMaxInactiveInterval()獲取 Session 的超時時間
public void invalidate() 讓當前 Session 會話馬上超時無效。
Session 預設的超時時長是多少!
Session 預設的超時時間長為 30 分鐘。
因為在 Tomcat 伺服器的配置檔案 web.xml中預設有以下的配置,它就表示配置了當前 Tomcat 伺服器下所有的 Session
超時配置預設時長為:30 分鐘。

30

如果說。你希望你的 web 工程,預設的 Session 的超時時長為其他時長。你可以在你自己的 web.xml 配置檔案中做
以上相同的配置。就可以修改你的 web 工程所有 Seession 的預設超時時長

20

如果你想只修改個別 Session 的超時時長。就可以使用上面的 API。setMaxInactiveInterval(int interval)來進行單獨的設
置。
session.setMaxInactiveInterval(int interval)單獨設定超時時長。

Session 超時的概念介紹:

示例程式碼:

protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 先獲取 Session 物件
HttpSession session = req.getSession();
// 設定當前 Session3 秒後超時
session.setMaxInactiveInterval(3);
resp.getWriter().write("當前 Session 已經設定為 3 秒後超時");
}

Session 馬上被超時示例:

protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 先獲取 Session 物件
HttpSession session = req.getSession();
// 讓 Session 會話馬上超時
session.invalidate();
resp.getWriter().write("Session 已經設定為超時(無效)");

瀏覽器和 Session 之間關聯的技術內幕
Session 技術,底層其實是基於 Cookie 技術來實現的。

session id的URL重寫

        當瀏覽器將cookie禁用,基於cookie的session將不能正常工作,每次使用request.getSession() 都將建立一個新的session。達不到session共享資料的目的,但是我們知道原理,只需要將session id 傳遞給伺服器session就可以正常工作的。

        解決:通過URL將session id 傳遞給伺服器:URL重寫

          手動方式: url;jsessionid=....

          api方式:

               encodeURL(java.lang.String url) 進行所有URL重寫

               encodeRedirectURL(java.lang.String url) 進行重定向 URL重寫 

               這兩個用法基本一致,只不過考慮特殊情況,要訪問的連結可能會被Redirect到其他servlet去進行處理,這樣你用上述方法帶來的session的id資訊不能被同時傳送到其他servlet.這時候用encodeRedirectURL()方法就可以了 

          如果瀏覽器禁用cooke,api將自動追加session id ,如果沒有禁用,api將不進行任何修改。

          注意:如果瀏覽器禁用cookie,web專案的所有url都需進行重寫。否則session將不能正常工作

四、總結

    知道了什麼是cookie和什麼是session?

       cookie是一種在客戶端記錄使用者資訊的技術,因為http協議是無狀態的,為了解決這個問題而產生了cookie。記錄使用者名稱等一些應用

       session是一種在服務端記錄使用者資訊的技術,一般session用來在伺服器端共享資料,

    cookie的工作原理?session的工作原理?

       cookie工作原理,可以看上面講解cookie的那張圖,cookie是由伺服器端建立傳送回瀏覽器端的,並且每次請求伺服器都會將cookie帶過去,以便伺服器知道該使用者是哪一個。其cookie中是使用鍵值對來儲存資訊的,並且一個cookie只能儲存一個鍵值對。所以在獲取cookie時,是會獲取到所有的cookie,然後從其中遍歷。

session的工作原理就是依靠cookie來做支撐,第一次使用request.getSession()時session被建立,並且會為該session建立一個獨一無二的sessionid存放到cookie中,然後傳送會瀏覽器端,瀏覽器端每次請求時,都會帶著這個sessionid,伺服器就會認識該sessionid,知道了sessionid就找得到哪個session。以此來達到共享資料的目的。 這裡需要注意的是,session不會隨著瀏覽器的關閉而死亡,而是等待超時時間。

  

      如果對cookie和session還有不理解的地方,用大家肯定都會用,就是需要理解,為什麼需要使用cookie和session,可以看看那個會員卡的例子,cookie和session只是為了解決http協議無狀態的這種缺陷,為了記錄使用者資訊,記錄瀏覽器和伺服器之間的狀態和衍生出來的