天天看點

[Servlet&JSP] HttpSession會話管理HttpSession的使用HttpSession會話管理原理HttpSession與URL重寫

我們可以将會話期間必須共享的資料儲存在httpsession中,使之成為屬性。如果使用者關掉浏覽器接受cookie的功能,httpsession也可以改用url重寫的方式繼續其會話管理功能。

在servlet/jsp中,如果要進行會話管理,可以使用httpservletrequest的getsession()方法取得httpsession對象。語句如下:

getsession()方法有兩個版本,另一個版本可以傳入布爾值,預設為true,表示若尚未存在httpsession執行個體,則直接建立一個新的對象;若傳入為false,表示若尚未存在httpsession執行個體,則直接傳回null。

httpsession上最常用的方法時setattribute()與getattribute(),可以在對象中設定和取得屬性。預設在關閉浏覽器前,所取得的httpsession都是形同的執行個體。如果想要在此次會話期間直接讓目前的httpsession失效,則可以執行httpsession的invalidate()方法。一個使用的時機就是實作登出機制。一個示例如下:

login.java:

在登入時,如果使用者名與密碼正确,就會取得httpsession并設定一個login屬性,用以代表使用者完成登入的動作。對于其他的servlet/jsp,如果可以從httpsession取得login屬性,基本就可以确定是個已登入的使用者,這類用來識别使用者是否登入的屬性,通常稱為登入字元(login token)。在上例中,登入成功後會轉發到使用者界面。

user.jsp:

login.html

logout.java:

指定httpsession的invalidate()之後,容器就會銷毀并回收httpsession對象。如果再次執行httpservletrequest的getsession(),則說的取得的httpsession就是另外一個新的對象了。

當執行httpservletrequest的getsession()時,web容器會建立httpsession對象,每個httpsession都會有一個特殊的id,稱之為session id。可以執行httpsession的getid()可以取得session id。這個session id預設會使用cookie将其存放至浏覽器。在tomcat中,cookie的名稱是jsessionid,數字則是getid()所取得的session id。

每個httpsession都有個特殊的session id,當浏覽器請求應用程式時,會将cookie中存放的session id一并發送給應用程式,web容器根據session id來取出對應的httpsession對象,如此就可以取得各個浏覽器的會話資料。

是以使用httpsession來進行會話管理時,設定為屬性的資料是儲存在伺服器端的,而session id預設使用cookie存放于浏覽器中。web容器儲存session id的cookie被設定為關閉則浏覽器就會失效,重新打開浏覽器請求應用程式時,通過getsession()所取得的是新的httpsession對象。

由于httpsession會占用記憶體空間,是以httpsession得屬性中盡量不要儲存耗資源的大型對象,必要時可将屬性移除,或者不需使用httpsession時,執行invalidate()讓httpsession失效。

關閉浏覽器時會馬上失效的是浏覽器上的cookie,而不是httpsession。

可以執行httpsession的setmaxinactiveinterval()方法,設定浏覽器在多久沒有請求應用程式的情況下,httpsession就會自動失效,設定的機關是”秒”。也可以在web.xml中設定httpsession預設的失效時間,但要注意的時,這裡設定的時間機關是”分鐘”。例如:

儲存session id的cookie被設定為關閉浏覽器就失效。關閉浏覽器後若希望儲存資訊,必須通過自行操作cookie來達成,例如完成自動登入機制。

如果在使用者禁用cookie的情況下,仍打算運用httpsession來進行會話管理,那麼可以搭配url重寫的方式,向浏覽器響應一段超連結,超連結url後附加session id,當使用者點選超連結時,則将session id以get請求方式發送給web應用程式。

如果要使用url重寫的方式來發送session id,則可以使用httpservletrequest的encodeurl()協助産生所需的url重寫。當容器嘗試取得httpsession執行個體時,若可以從http請求中取得帶有session id的cookie,encodeurl()會将設定給它的url原封不動的輸出;若無法從http請求中取得帶有session id的cookie(通常是浏覽器禁用cookie的情況),encodeurl()會自動産生帶有session id的url重寫。

如果有執行encdeurl(),在浏覽器第一次請求網站時,容器并不知道浏覽器是否禁用cookie,是以容器的做法是cookie(發送set-cookie标頭)與url重寫都做,是以若servlet有以下語句,無論浏覽器是否禁用cookie,第一次請求時,都會顯示編上session id的url。

當再次請求時,如果浏覽器沒有禁用cookie,則容器可以從cookie(從cookie标頭)中取得session id,此時encodeurl()就隻會輸出index.jsp。如果浏覽器禁用cookie,則encodeurl()就會繼續在url上編上session id

httpservletresponse的另一個方法encoderedirecturl()方法,可以在要去浏覽器重定向時,在url上編上session id。