Session與Cookie底層原理

學習目錄

1.會話入門java

2.cookie瀏覽器

3.session緩存

4.自定義緩存安全

5.自定義Token服務器

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

1、會話管理入門 

1.二、軟件中的會話網絡

打開瀏覽器 -> 瀏覽商品列表  -> 加入購物車(把商品信息保存下來)  -> 關閉瀏覽器session

打開瀏覽器->  直接進入購物車 -> 查看到上次加入購物車的商品 -> 下訂單 -> 支付dom

在購物會話過程當中,如何保存商品信息暱?分佈式

會話管理:管理瀏覽器客戶端服務器端之間會話過程當中產生的會話數據。

域對象: 實現資源之間的數據共享。

    request域對象:必定要使用轉發技術來跳轉頁面

    context域對象:context是全部用戶公有的資源會覆蓋數據

解決辦法: 可使用session域對象來保存會話數據

1.三、會話技術

Cookie技術:會話數據保存在瀏覽器客戶端。

 Session技術:會話數據保存在服務器端。

2、cookie

2.一、cookie特色:會話數據保存在瀏覽器客戶端。

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.五、案例-顯示用戶上次訪問時間

3、session

3.一、使用session的優點

通過上面瞭解到cookie的侷限

1)Cookie只能存字符串類型。不能保存對象

2)只能存非中文。

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

 若是用想存非字符串、超過4kb內容 那就得用咱們接下的主角 session啦。session的特色:會話存在服務器內存中

3.二、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.三、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.四、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

4、自定義緩存

5、自定義Token

5.一、什麼是token ?

token是一個令牌,具備隨機性,相似於sessionId。在對接一些第三方平臺的時候,爲了可以保證數據安全性,一般會使用一些令牌進行交互

5.二、    如何自定義token 

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

5.三、什麼是uuid

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

UUID 的目的,是讓分佈式系統中的全部元素,都能有惟一的辨識資訊,而不須要透過中央控制端來作辨識資訊的指定。如此一來,每一個人均可以創建不與其它人衝突的 UUID。

5.四、使用UUDID生成Token

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

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

6.1、產生表單重複提交的緣由:網絡延遲、從新刷新、點擊網頁回退到以前頁面繼續提交

6.2、解決方式 

1)使用JavaScript

缺點:用戶從新刷新仍是會出現重複提交

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

 具體的作法:在服務器端生成一個惟一的隨機標識號,專業術語稱爲Token(令牌),同時在當前用戶的Session域中保存這個Token。而後將Token發送到客戶端的Form表單中,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一塊兒提交到服務器端,而後在服務器端判斷客戶端提交上來的Token與服務器端生成的Token是否一致,若是不一致,那就是重複提交了,此時服務器端就能夠不處理重複提交的表單。若是相同則處理表單提交,處理完後清除當前用戶的Session域中存儲的標識號。

轉發代碼

相關文章
相關標籤/搜索