如果,我們需要保留用戶的狀態信息,則可以嘗試使用session(HTTP是無狀態的嘛!)
假設我們有如下場景:
-Hey,Siri! -我有什么可以幫你的? -給我講一個冷笑話。 -好的,blahblah。 -再來一個。 -對不起,我沒聽懂你在說什么。
如何讓Siri能夠上下文聯想呢?Session機制這時候就很有用,Session機制提供的是:
同一用戶同一Session不同請求不同線程Session是這樣開始工作的:
容器為我們做了絕大多部分工作:
創建會話生成SessionID(向客戶端設置set-cookie首部)ID與會話匹配我們唯一需要做的事就是:
// 這行代碼不創建SessionHttpSession session = request.getSession(false);if (session == null) { session = request.getSession();}如果我們恰巧禁用了Cookie,我們需要使用URL重寫技術
// 向someurl增加額外的會話IDresponse.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
新聞熱點
疑難解答