若是,咱們須要保留用戶的狀態信息,則能夠嘗試使用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