因為http協定是stateless
stateless的意思指它不記得狀態
因使你在逛下一頁時
它沒有辦法知道你上一頁在幹嘛
因此
我們需要session機制來輔助
它的作用原理是client(一般情況下, 指的是瀏覽器)
向server(指web container, 如tomcat)
發送請求封包後
web container端便會檢查該封包是否有cookie資訊
再檢查裡面是否帶有JSESSIONID這樣的參數
如果有
則取回原session
沒有的話
web container會給null或新的session
這要視你程式寫法而定
servlet可以選擇要null或新的session
但是jsp一定是新的session
建立了session之後
使用者資訊都被存在裡面
直到session中斷
session中斷有兩個方式:
1.使用者關掉瀏覽器, 使得client端"忘了"它的JSESSIONID.
2.server端web container的session timeout. 以tomcat為例, 預設是30分鐘.
但是各專案可以自己設定, 在web.xml中加入以下標籤
<session-config>
<session-timeout>10</session-timeout>
</session-config>
就會將時間設為10"分鐘"
亦可以每個專案底下的session都設定不同timeout時間
setMaxInactiveInterval(int interval)
(注意這裡interval的時間單位是"秒", 和web.xml裡設定的"分鐘"不一樣!)
還記得小時後去超市
都要在櫃台寄放包包
它會給你一個號碼牌
購物完出來再憑此號碼排拿包
可以用這個拿包來比喻session中斷情況:
:包包(session)依然在櫃台(指server), 但client端沒有了號碼牌, 所以無法提取, 等於沒有包包.
分析: 這樣的狀況會在server端留下無用的seesion資料, 因為再也沒辦法被存取到.
(除非有心人士去改了他本機cookie裡面的JSESSIONID資訊.)
因為沒辦法被存取到, 等於留了很多垃圾, 很佔記憶體空間. 有時你會在櫃台看到上次你來就有的包擺在那, 佔了一個儲存格空間.
:client端依然有號碼牌, 但是購物逛太久, 超過預設保管時間30分鐘沒來拿, 所以櫃台自動把包包銷毀.......
分析:server端不會留垃圾下來, 還可以接受.
:client端沒有號碼牌, 櫃台也已銷毀包包
分析:很好大家都沒遺憾了~
一般認為只要瀏覽器關掉
session就結束
其實只是JSESSIONID不見了
但是session資料仍然留在server端佔空間
為了替server著想
建議大家下次逛網站時
如果該網站有登入機制
記得好心一點按登出
這樣可以幫網站減少一點負擔哦!
沒有留言:
張貼留言