通俗易懂講解cookie和session的用法用途,執行流程,區別聯繫以及常見問題

前言:

       本篇文章是以實際生產中遇到的問題爲導向寫的,所以在體系上沒有那麼詳細。請各位看官多多包涵,若有不當之處歡迎批評指正。

 

1.爲什麼要有cookie/session?

在客戶端瀏覽器向服務器發送請求,服務器做出響應之後,二者便會斷開連接(一次會話結束)。那麼下次用戶再來請求服務器,服務器沒有任何辦法去識別此用戶是誰。比如web系統常用的用戶登錄功能,如果沒有cookie機制支持,那麼只能通過查詢數據庫實現,並且要命的是每次刷新頁面都要重新輸入表單信息查詢一次數據庫纔可以識別用戶,這會給開發人員帶來大量冗餘工作並且簡單的用戶登錄功能會給服務器帶來巨大的壓力。

在此背景下,就急需一種機制來解決此問題。分析可知,以上需求的實現就要客戶端每次訪問服務器時從客戶端帶上一些數據(相當於身份證)告知服務器自己是誰。這個數據就是cookie!並且客戶端訪問服務器時不能將所有cookie都帶過去,比如訪問百度就不能把谷歌的cookie帶給百度,這個設置方式在後面介紹。

那麼有了cookie,爲什麼還要有session呢?有了cookie可以向服務器證明用戶身份了,我們的web系統中是不是需要將用戶的詳細信息儲存在某個位置供頁面調用呢?用戶的詳細信息就包括姓名,年齡,性別等信息。而cookie是存在於客戶端的,將用戶詳細信息通過網絡發送到客戶端保存是極不安全的。且cookie大小不能超過4k,不能支持中文。這就限制cookie不能滿足存儲用戶信息的需求。這就需要一種機制在服務器端的某個域中存儲一些數據,這個域就是session。

總而言之,cookie/session的出現就是爲了解決http協議無狀態的弊端,爲了讓客戶端和服務端建立長久聯繫而出現的。

2.什麼是會話技術?

幫你存儲一些在交互過程臨時產生的數據

當你打開瀏覽器,訪問一個網站,認爲會話開始了,當你關閉瀏覽器的時候,會話結束了

3.cookie/session執行流程(這纔是重點)

cookie執行流程

當你去訪問應用的時候,來到服務器。服務器設置一個cookie(後邊介紹api),在做響應的時候會通過set-cookie響應頭將cookie帶給瀏覽器。

來到瀏覽器,瀏覽器會將此數據保存起來,接下來再次去訪問服務器的時候,瀏覽器會根據cookie的path屬性(後邊api介紹)將這些數據帶回去(設置了一個叫做cookie的請求頭),來到服務器,服務器有對應的api獲取這些值,有了值就知道用戶是誰了。


session執行流程

瀏覽器發起一個請求到服務器,服務器先檢查你是否攜帶了一個叫做JSESSIONID的cookie

如果有攜帶,會將此cookie的取出來(比如爲aaa123),然後從服務器的session池中找到ID爲aaa123的session返回給調用者。

如果沒有攜帶這個JSESSIONID的cookie,那麼服務器將會自動創建一個session對象並且生成一個隨機字符串(如aaa123)作爲此session的ID保存到session池中。在服務器爲客戶端瀏覽器作響應的時候自動創建一個鍵爲“JSESSIONID” 值爲“aaa123”的cookie對象讓瀏覽器儲存起來以便下次再訪問的時候帶過來。
          

4.cookie的常用屬性api

        Cookie cookie = new Cookie("name","tom"); // 新建Cookie

cookie就是鍵值對的數據,如果是中文不能直接設置,需要編碼

        cookie.setDomain("www.baidu.com"); // 設置域名

這樣設置域名的話,該cookie會被提交到www.baidu.com但是不會被提交到zhidao.baidu.com。要想都提交過去,需要這樣設置cookie.setDomain(".baidu.com");

        cookie.setPath("/search"); // 設置路徑   

這樣設置路徑,該cookie只會被提交到www.baidu.com/search路徑下的頁面,也就是說在www.baidu.com/aaa下的頁面是獲取不到該cookie的。一般cookie在某個網站裏都是可用的,直接設置爲/,cookie.setPath("/");

        cookie.setMaxAge(60*60*24*7); // 設置有效期

MaxAge屬性單位爲秒,默認爲-1也就是關閉瀏覽器自動銷燬。cookie.setMaxAge(60*60*24*7); 這樣設置意思是不管瀏覽器關閉與否,將此cookie持久化到客戶端文件裏保存一週。參數爲正數時瀏覽器都會將相應的cookie做持久化處理。

        response.addCookie(cookie); // 輸出到客戶端

5.session常用api

HttpSession session = request.getSession(); // 創建session

session.setAttribute("name","tom"); // 設置Session屬性

out.println("歡迎您:" +session.getAttribute("name")); // 獲取Session屬性

在tomcat配置文件中配置session的超時時間
            <session-config>
                <session-timeout>分鐘爲單位</session-timeout>
            </session-config>

6.cookie/session的區別與聯繫

區別:

1.cookie存放在客戶端,session存放在服務器端。

2.cookie只能存放4k的數據,而session理論上沒有做限制

聯繫:

session雖說存放在服務器端,但是仔細看剛纔的執行流程你會明白,session是依賴於cookie的,這一點也是本篇文章想要着重強調的

7.cookie/session使用注意事項

1.cookie大小有限制 4k

2.cookie不能跨瀏覽器

3.cookie不支持中文

4.如果是安全性較高的數據應存放在session中,因爲cookie存放在客戶端總會輕易被不法分子獲取

5.如果是訪問量特別大的網站,儘量不要在session中存儲用戶數據,因爲每個用戶存一個session會給服務器造成很大的壓力

8.新手使用session時常踩的坑

很多人使用session時希望用戶信息可以保存一段時間比如保存7天,於是配置了Tomcat的

<session-config>

        <session-timeout>7天</session-timeout>

</session-config>。

配置完後發現,關閉瀏覽器後再訪問還是取不到session。這是因爲session的配置沒起作用嗎?不是的,其實session還是存在於服務器的,只是沒有設置cookie持久化,cookie默認就會在瀏覽器關閉時銷燬,所以叫做JSESSIONID的cookie也被銷燬了,再到服務器的時候沒有這個叫JSESSIONID的cookie就取不到相關的session了。

所以,如果想7天內都能訪問到session,需要將cookie也設置持久化!

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章