2011年5月18日 星期三

web Application的session中斷

因為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著想
建議大家下次逛網站時
如果該網站有登入機制
記得好心一點按登出
這樣可以幫網站減少一點負擔哦!

沒有留言:

張貼留言