1. 程式人生 > >Session與Cookie底層原理

Session與Cookie底層原理

學習目錄

1.會話入門

2.cookie

3.session

4.自定義快取

5.自定義Token

6.表單重複提交(Http重複提交)

一、會話管理入門 

1.2、軟體中的會話

開啟瀏覽器 -> 瀏覽商品列表  -> 加入購物車(把商品資訊儲存下來)  -> 關閉瀏覽器

開啟瀏覽器->  直接進入購物車 -> 檢視到上次加入購物車的商品 -> 下訂單 -> 支付

在購物會話過程中,如何儲存商品資訊暱?

會話管理:管理瀏覽器客戶端

伺服器端之間會話過程中產生的會話資料。

域物件: 實現資源之間的資料共享。

    request域物件:一定要使用轉發技術來跳轉頁面

    context域物件:context是所有使用者公有的資源會覆蓋資料

解決辦法: 可以使用session域物件來儲存會話資料

1.3、會話技術

Cookie技術:會話資料儲存在瀏覽器客戶端。

 Session技術:會話資料儲存在伺服器端。

二、cookie

2.1、cookie特點:會話資料儲存在瀏覽器客戶端。

2.2、cookie技術核心

cookie類:用於儲存會話資料

1)構造Cookie物件  

      new  Cookie(java.lang.Stringname, java.lang.String value)

2)設定cookie

       void setPath(java.lang.String uri)   :設定cookie的有效訪問路徑

       void setMaxAge(int expiry) : 設定cookie的有效時間

       void setValue(java.lang.String newValue) :設定cookie的值

 3)傳送cookie到瀏覽器端儲存

       void response.addCookie(Cookie cookie)  : 傳送cookie

 4)伺服器接收cookie

      Cookie[] cookies =request.getCookies()  : 接收cookie

2.3:cookie原理

1)伺服器建立cookie物件,把會話資料儲存到cookie物件中。

         new Cookie("name","value");

 2)  伺服器傳送cookie資訊到瀏覽器

        response.addCookie(cookie);

        舉例: set-cookie:name=eric  (隱藏傳送了一個set-cookie名稱的響應頭)

  3)瀏覽器得到伺服器傳送的cookie,然後儲存在瀏覽器端。

 4)瀏覽器在下次訪問伺服器時,會帶著cookie資訊

       舉例: cookie: name=eric (隱藏帶著一個叫cookie名稱的請求頭)

5)伺服器接收到瀏覽器帶來的cookie資訊

       request.getCookies();

2.4:cookie的細節

1)void setPath(java.lang.String uri)  :設定cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑儲存在哪裡,那麼瀏        覽器在有效路徑下訪問伺服器時就會帶著cookie資訊,否則不帶cookie資訊。                     

2)void setMaxAge(int expiry) : 設定cookie的有效時間。

        正整數:表示cookie資料儲存瀏覽器的快取目錄(硬碟中),數值表示儲存的時間。

        負整數:表示cookie資料儲存瀏覽器的記憶體中。瀏覽器關閉cookie就丟失了!!

         零:表示刪除同名的cookie資料

3)Cookie資料型別只能儲存非中文字串型別的。可以儲存多個cookie,但是瀏覽器一般只允許存放300個Cookie,每個站點         最多存放20個Cookie,每個Cookie的大小限制為4KB。

2.5、案例-顯示使用者上次訪問時間

三、session

3.1、使用session的優勢

經過上面瞭解到cookie的侷限

1)Cookie只能存字串型別。不能儲存物件

2)只能存非中文。

3)1個Cookie的容量不超過4KB。

 如果用想存非字串、超過4kb內容 那就得用我們接下的主角 session啦。session的特點:會話存在伺服器記憶體中

3.2、session核心

HttpSession類:用於儲存會話資料

1)建立或得到session物件

       HttpSession getSession() 

       HttpSession getSession(booleancreate) 

2)設定session物件

       void setMaxInactiveInterval(intinterval)  :設定session的有效時間

        void invalidate()     :銷燬session物件

        java.lang.String getId()  :得到session編號

3)儲存會話資料到session物件

        void setAttribute(java.lang.Stringname, java.lang.Object value)  :儲存資料

        java.lang.ObjectgetAttribute(java.lang.String name)  :獲取資料

        voidremoveAttribute(java.lang.String name) :清除資料

3.3、session原理

1)第一次訪問建立session物件,給session物件分配一個唯一的ID,叫JSESSIONID

        newHttpSession();

2)把JSESSIONID作為Cookie的值傳送給瀏覽器儲存

         Cookiecookie = new Cookie("JSESSIONID", sessionID);

        response.addCookie(cookie);

3)第二次訪問的時候,瀏覽器帶著JSESSIONID的cookie訪問伺服器

4)伺服器得到JSESSIONID,在伺服器的記憶體中搜索是否存放對應編號的session物件。

                                            if(找到){

                                                     returnmap.get(sessionID);

                                            }

                                            Map<String,HttpSession>]

                                            <"s001",s1>

                                            <"s001,"s2>

5)如果找到對應編號的session物件,直接返回該物件

6)如果找不到對應編號的session物件,建立新的session物件,繼續走1的流程

結論:通過JSESSIONcookie值在伺服器找session物件!!!!!

3.4、session細節

1)java.lang.String getId()  :得到session編號

2)兩個getSession方法:getSession(true)/ getSession()  : 建立或得到session物件。沒有匹配的session編號自動建立新的                                                  session物件。

                                         getSession(false):              得到session物件。沒有匹配的session編號,返回null

 3)void setMaxInactiveInterval(int interval)  : 設定session的有效時間

     session物件銷燬時間:

    3.1預設情況30分伺服器自動回收

   3.2修改session回收時間

   3.3全域性修改session有效時間

案例 建立和獲取session

建立session 

注意 當你瀏覽器關閉session Id會被清空掉 

session的實現原理 服務端返回sessionId給客戶端儲存  客戶端通過本地SessionId請求 查詢伺服器儲存的sessionId

四、自定義快取

五、自定義Token

5.1、什麼是token ?

token是一個令牌,具有隨機性,類似於sessionId。在對接一些第三方平臺的時候,為了能夠保證資料安全性,通常會使用一些令牌進行互動

5.2、    如何自定義token 

token生成規則,只要保證token生成一個不重複的唯一字串即可,使用jdk自帶的uuid生成規則。

5.3、什麼是uuid

UUID含義是通用唯一識別碼 (Universally Unique Identifier),這是一個軟體建構的標準,也是被開源軟體基金會 (Open Software Foundation, OSF) 的組織應用在分散式計算環境 (Distributed ComputingEnvironment, DCE) 領域的一部分。

UUID 的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的 UUID。

5.4、使用UUDID生成Token

String tokenId=UUID.randomUUID().toString();

六、表單重複提交(Http重複提交)

6.1、產生表單重複提交的原因:網路延遲、重新重新整理、點選網頁回退到之前頁面繼續提交

6.2、解決方式 

1)使用JavaScript

缺點:使用者重新重新整理還是會出現重複提交

2)、使用伺服器提交解決

 具體的做法:在伺服器端生成一個唯一的隨機標識號,專業術語稱為Token(令牌),同時在當前使用者的Session域中儲存這個Token。然後將Token傳送到客戶端的Form表單中,在Form表單中使用隱藏域來儲存這個Token,表單提交的時候連同這個Token一起提交到伺服器端,然後在伺服器端判斷客戶端提交上來的Token與伺服器端生成的Token是否一致,如果不一致,那就是重複提交了,此時伺服器端就可以不處理重複提交的表單。如果相同則處理表單提交,處理完後清除當前使用者的Session域中儲存的標識號。

轉發程式碼