【Servlet】04-使用Session

若是,咱們須要保留用戶的狀態信息,則能夠嘗試使用Session(HTTP是無狀態的嘛!)java

假設咱們有以下場景:服務器

-Hey,Siri!
-我有什麼能夠幫你的?
-給我講一個冷笑話。
-好的,blahblah。
-再來一個。
-對不起,我沒聽懂你在說什麼。cookie

如何讓Siri可以上下文聯想呢?Session機制這時候就頗有用,Session機制提供的是:session

  • 同一用戶併發

  • 同一Session負載均衡

  • 不一樣請求分佈式

  • 不一樣線程工具

Session是這樣開始工做的:url

客戶端->服務器:發送一個請求
服務器->客戶端:設置Cookie/惟一的SessionID
客戶端->服務器:再次請求+上次的Cookie

容器爲咱們作了絕大多部分工做:線程

  • 建立會話

  • 生成SessionID(向客戶端設置set-cookie首部)

  • ID與會話匹配

咱們惟一須要作的事就是:

// 這行代碼不建立Session
HttpSession session = request.getSession(false);
if (session == null) {
    session = request.getSession();
}

若是咱們恰巧禁用了Cookie,咱們須要使用URL重寫技術

// 向someurl增長額外的會話ID
response.encodeURL(someurl);

會話的技術問題解決了,可是爲了服務器的負擔問題,咱們不可能一直在服務器端保留用戶的會話信息,會話存活問題也就須要解決。

咱們查看HttpSession的API以後,有以下列表:

方法名 返回結果 做用
getCreateTime() 建立時間的毫秒 獲取Session的建立時間
getLastAccessedTime() 上次訪問時間的毫秒 同左
setMaxInactiveInterval() X 設置session存活時間,單位爲秒
invalidate() X session失效

P.S. 咱們能夠在DD中設置Session的存活時間:

<session-config>
    <!--單位爲分鐘-->
    <session-timeout></session-timeout>
</session-config>

做爲客戶端驗證的工具Cookie,咱們有以下方法:

方法名 返回結果 做用
getCookies() 獲取全部的Cookie 同左
setMaxAge() 設置Cookie的優秀時間,單位爲秒數 X
addCookie() 設置一個Cookie 同左

下面,咱們來探討一下分佈式應用中的Session問題。
咱們知道的是,對於一個分佈式應用,每一個VM的Servlet有一個ServletContext,有一個ServletConfig。對於一次會話,只有一個HttpSession對象。而後,咱們就有了會話遷移技術:

Web容器爲了負載均衡,將HttpSession遷移到其它VM的技術。

和會話有關的接口以下所示:

HttpSessionListener --> SessionListener

類名 做用 實現類
HttpSessionListener 查看併發用戶 其它類
HttpSessionBindingListener 查看實現該接口的類被綁定到會話的狀況 屬性類
HttpSessionAttributeListener 查看會話中屬性的增刪改狀況 其它類
HttpSessionActivationListener 會話遷移到其它VM的狀況 X

P.S. 和Session有關的事件監聽器只有 HttpSessionAttributeEvent和HttpSessionBindingEvent

相關文章
相關標籤/搜索