Session,Cookie小小總結

Session/Cookie 小小總結

1. Session機制

1.1 Session是什麼

  • Session是一種記錄客戶狀態的機制,保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。
  • Session對應的類爲javax.servlet.http.HttpSession類。每個來訪者對應一個Session對象,所有該客戶的狀態信息都保存在這個Session對象裏。Session對象是在客戶端第一次請求服務器的時候創建的
  • Session也是一種key-value的屬性對,通過getAttribute(String key)和setAttribute(String key,Object value)方法讀寫客戶狀態信息。
  • Servlet裏通過request.getSession()方法獲取該客戶的Session,request還可以使用getSession(boolean create)來獲取Session。區別是如果該客戶的Session不存在,request.getSession()方法會返回null,而getSession(true)會先創建Session再將Session返回。
  • Servlet中必須使用request來編程式獲取HttpSession對象,而JSP中內置了Session隱藏對象,可以直接使用。如果使用聲明瞭<%@page session=“false” %>,則Session隱藏對象不可用。

1.2 Session的生命週期

  • Session在用戶第一次訪問服務器的時候自動創建。需要注意只有訪問JSP、Servlet等程序時纔會創建Session,只訪問HTML、IMAGE等靜態資源並不會創建Session。如果尚未生成Session,也可以使用request.getSession(true)強制生成Session。
  • Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,並維護該Session。用戶每訪問服務器一次,無論是否讀寫Session,服務器都認爲該用戶的Session“活躍(active)”了一次。

1.3 Session的有效期

  • 由於會有越來越多的用戶訪問服務器,因此Session也會越來越多。爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問過服務器,Session就自動失效了。
  • Session的超時時間爲maxInactiveInterval屬性,可以通過對應的getMaxInactiveInterval()獲取,通過setMaxInactiveInterval(longinterval)修改。
  • Session的超時時間也可以在web.xml中修改。另外,通過調用Session的invalidate()方法可以使Session失效。

1.4 Session的兩種傳遞方式

  • 通過cookies實現:就是把session的id 放在cookie裏面,因爲cookie有臨時的,也有定時的,臨時的就是當前瀏覽器什麼時候關掉即消失,也就是說session本來就是當瀏覽器關閉即消失的,所以可以用臨時的cookie存放。保存再cookie裏的sessionID一定不會重複,因爲是獨一無二的。
  • 通過URL重寫來實現:將該用戶Session的id信息重寫到URL地址中。服務器能夠解析重寫後的URL獲取Session的id。

2. Cookie機制

2.1 Cookie是什麼

  • 由於HTTP是一種無狀態的協議,服務器單從網絡連接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理

  • Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。

  • Java中把Cookie封裝成了javax.servlet.http.Cookie類。每個Cookie都是該Cookie類的對象。服務器通過操作Cookie類對象對客戶端Cookie進行操作。通過request.getCookie()獲取客戶端提交的所有Cookie(以Cookie[]數組形式返回),通過response.addCookie(Cookie cookie)向客戶端設置Cookie。

  • Cookie具有不可跨域名性,Cookie在客戶端是由瀏覽器來管理,瀏覽器判斷一個網站是否能操作另一個網站Cookie的依據是域名。

  • Unicode編碼和BASE64編碼:

    • 中文與英文字符不同,中文屬於Unicode字符,在內存中佔4個字符,而英文屬於ASCII字符,內存中只佔2個字節
    • Cookie中使用Unicode字符時需要對Unicode字符進行編碼,否則會亂碼。
    • Cookie不僅可以使用ASCII字符與Unicode字符,還可以使用二進制數據。使用二進制數據時也需要進行編碼,進行BASE64編碼。

2.2 Cookie的常用屬性

  • Cookie每個屬性對應一個getter方法和一個setter方法。

    屬性名 描述
    String name Cookie的名稱,一旦創建不可更改
    Object value Cookie的值,如果值爲Unicode字符,需要爲字符編碼。如果值爲二進制數據,則需要使用BASE64編碼
    int maxAge 該Cookie失效的時間,單位秒。如果爲正數,則該Cookie在maxAge秒之後失效。如果爲負數,該Cookie爲臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。如果爲0,表示刪除該Cookie。默認爲–1
    boolean secure 該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網絡上傳輸數據之前先將數據加密。默認爲false
    String path 該Cookie的使用路徑。如果設置爲“/sessionWeb/”,則只有contextPath爲“/sessionWeb”的程序可以訪問該Cookie。如果設置爲“/”,則本域名下contextPath都可以訪問該Cookie。注意最後一個字符必須爲“/”
    String domain 可以訪問該Cookie的域名。如果設置爲“.google.com”,則所有以“google.com”結尾的域名都可以訪問該Cookie。注意第一個字符必須爲“.”
    String comment 該Cookie的用處說明。瀏覽器顯示Cookie信息的時候顯示該說明
    int version 該Cookie使用的版本號。0表示遵循Netscape的Cookie規範,1表示遵循W3C的RFC 2109規範

2.3 Cookie的特點

  • 有效期:Cookie的maxAge決定着Cookie的有效期,單位爲秒(Second)。Cookie中通過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
  • 不可修改性:Cookie並不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,添加到response中覆蓋原來的Cookie。修改、刪除Cookie時,新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視爲兩個不同的Cookie不予覆蓋,導致修改、刪除失敗。
  • 安全性:secure屬性並不能對Cookie內容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程序中對Cookie內容加密、解密,以防泄密。

3. 兩者的區別

  • Cookie放在客戶端的瀏覽器上,session放在服務器上。
  • Cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。
  • 設置cookie時間可以使cookie過期。但是使用session-destory(),我們將會銷燬會話。
  • 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。(Session對象沒有對存儲的數據量的限制,其中可以保存更爲複雜的數據類型)

--------本篇完--------

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