Session & cookie
HTTP連線是無狀態的,一個請求發給伺服器,伺服器發回響應,連線結束。下一次再連線的時候,伺服器並不會知道這個客戶以前連線過,這樣在WEB應用中會出現問題,比如所,在購物車應用中,難道要使用者在一個請求中選完所有的商品再結賬?好在,我們有其他的方法來保持會話狀態,HttpSession物件可以跨越多個請求。
J 下面來看看在servlet中是如何實現的,
HttpSession session = request.getSession();
如果當前的請求資訊中帶有儲存session id的cookie,且該session id對應的session物件存在,則返回該物件。否則,該方法將建立新的session物件,並且將生成的session id作為cookie通過響應存到瀏覽器端。
這行程式碼隱含幫我們做了很多事情:
1:new HttpSession物件
2:產生唯一的session ID
3:new Cookie物件
4:將session ID和這個cookie物件繫結
5:通過response設定響應資訊頭,將這個cookie加入其中
另外getSession的過載版本getSession(false)在請求資訊中無儲存session id的cookie時,這個方法返回null。
J 如果在瀏覽器端禁用了cookie,那麼session id也就沒地方存放了,即HttpSession
session = request.getSession();並不會寫入新的cookie物件到客戶端。使用URL rewriting可以解決這個問題,只要在呼叫response.encodeURL(aURL)就可以了,它會自動的在原來URL的最後加上;jsessionid=….