1、什么是 session
session 是瀏覽器和服務器會話過程中,服務器分配的一塊儲存空間。服務器默認為瀏覽器在cookie中設置 sessionid,瀏覽器在向服務器請求過程中傳輸 cookie 包含 sessionid ,服務器根據 sessionid 獲取出會話中存儲的信息。
由於 http 協議是無狀態的,即 http 請求一次連接一次,數據傳輸完畢,連接就斷開了,下次訪問需要重新連接。
通過 cookie 中的 sessionid 字段和服務器端的 session 關聯,可以確定會話的身份信息。
2、session 比 cookie 更安全
用戶信息可以通過加密存儲到 cookie,但是這樣做的安全性很差,瀏覽器的 cookie 的容易被其他程序獲取和篡改。使用 session 的意義在於 session 存儲在服務器,相對安全性更高。
3、session 的生命周期
- 創建
瀏覽器訪問服務器的 servlet(jsp)時,服務器會自動創建 session,並把 sessionid 通過 cookie 返回到瀏覽器。
servlet 規范中,通過 request.getSession(true) 可以強制創建 session。
- 銷毀
服務器會默認給 session 一個過期時間,即從該 session 的會話在有效時間內沒有再被訪問就會被設置過超時,需要重新建立會話。
如 tomcat 的默認會話超時時間為30分鍾。
會話超時時間是可以通過配置文件設置,如修改 web.xml 、server.xml 文件
1、web.xml 文件
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2、server.xml 文件
<Context path="/demo" docBase="/demo" defaultSessionTimeOut="3600"
isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>
調用 servlet api 手動設置 session 超時時間
request.getSession().setMaxInactiveInterval(60 * 30);//session 30分鍾失效
調用 servlet api 手動銷毀 session
request.getSession().invalidate();
4、注意事項
如果瀏覽器禁用 cookie,默認情況下 session 無法生效。可以通過url重載攜帶 sessionid 參數、把 sessionid 設置為 http 協議 header 設為其他自定義字段中,請求中始終攜帶。
當用戶量很大、 session 的失效時間很長,需要注意 session 的查找和存儲對服務器性能的影響。
web 容器可以設置 session 的鈍化(從內存持久化到文件) 和 活化(從文件讀到內存),提高性能。
- Java 自學指南
- Java 面試題匯總PC端瀏覽【點這里】
- Java知識圖譜
- Java 面試題匯總小程序瀏覽,掃二維碼