会话跟踪技术之HttpSession
?1 ? ?HttpSession概述
1.1 什么是HttpSesssion
? ? ? ?javax.servlet.http.HttpSession接口表示一個會話,我們可以把一個會話內需要共享的數據保存到HttSession對象中!
?
1.2 獲取HttpSession對象
? ? ? ?HttpSession request.getSesssion():如果當前會話已經有了session對象那么直接返回,如果當前會話還不存在會話,那么創建session并返回;
? ? ? ?HttpSession request.getSession(boolean):當參數為true時,與requeset.getSession()相同。如果參數為false,那么如果當前會話中存在session則返回,不存在返回null;
?
1.3 HttpSession是域對象
? ? ? ?HttpServletRequest、ServletContext,它們都是域對象,HttpSession也是域對象。它們三個是Servlet中可以使用的域對象,而JSP中可以多使用一個域對象PageContext。
? ? ? ?HttpServletRequest:一個請求創建一個request對象,所以在同一個請求中可以共享request,例如一個請求從AServlet轉發到BServlet,那么AServlet和BServlet可以共享request域中的數據;
? ? ? ?ServletContext:一個應用只創建一個ServletContext對象,所以在ServletContext中的數據可以在整個應用中共享,只要不啟動服務器,那么ServletContext中的數據就可以共享;
? ? ? ?HttpSession:一個會話創建一個HttpSession對象,同一會話中的多個請求中可以共享session中的數據;
?
? ? ? 下面是session的域方法:
? ? ? ?void setAttribute(String name, Object value):用來存儲一個對象,也可以稱之為存儲一個域屬性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一個域屬性,域屬性名稱為xxx,域屬性的值為XXX。請注意,如果多次調用該方法,并且使用相同的name,那么會覆蓋上一次的值,這一特性與Map相同;
? ? ? ?Object getAttribute(String name):用來獲取session中的數據,當前在獲取之前需要先去存儲才行,例如:String value = (String) session.getAttribute(“xxx”);,獲取名為xxx的域屬性;
? ? ? ?void removeAttribute(String name):用來移除HttpSession中的域屬性,如果參數name指定的域屬性不存在,那么本方法什么都不做;
? ? ? ?Enumeration getAttributeNames():獲取所有域屬性的名稱;
2 session的實現原理
? ? ? ?session底層是依賴Cookie的!我們來理解一下session的原理吧!
? ? ? ?當我首次去銀行時,因為還沒有賬號,所以需要開一個賬號,我獲得的是銀行卡,而銀行這邊的數據庫中留下了我的賬號,我的錢是保存在銀行的賬號中,而我帶走的是我的卡號。
? ? ? ?當我再次去銀行時,只需要帶上我的卡,而無需再次開一個賬號了。只要帶上我的卡,那么我在銀行操作的一定是我的賬號!
?
? ? ? ?當首次使用session時,服務器端要創建session,session是保存在服務器端,而給客戶端的session的id(一個cookie中保存了sessionId)。客戶端帶走的是sessionId,而數據是保存在session中。
? ? ? ?當客戶端再次訪問服務器時,在請求中會帶上sessionId,而服務器會通過sessionId找到對應的session,而無需再創建新的session。
?
3 session與瀏覽器
? ? ? session保存在服務器,而sessionId通過Cookie發送給客戶端,但這個Cookie的生命不-1,即只在瀏覽器內存中存在,也就是說如果用戶關閉了瀏覽器,那么這個Cookie就丟失了。
? ? ? ?當用戶再次打開瀏覽器訪問服務器時,就不會有sessionId發送給服務器,那么服務器會認為你沒有session,所以服務器會創建一個session,并在響應中把sessionId中到Cookie中發送給客戶端。
? ? ? ?你可能會說,那原來的session對象會怎樣?當一個session長時間沒人使用的話,服務器會把session刪除了!這個時長在Tomcat中配置是30分鐘,可以在${CATALANA}/conf/web.xml找到這個配置,當然你也可以在自己的web.xml中覆蓋這個配置!
web.xml
| ??? <session-config> ??????? <session-timeout>30</session-timeout> ??? </session-config> |
?
? ? ? ?session失效時間也說明一個問題!如果你打開網站的一個頁面開始長時間不動,超出了30分鐘后,再去點擊鏈接或提交表單時你會發現,你的session已經丟失了!
?
4 session其他常用API
? ? ? ?String getId():獲取sessionId;
? ? ? ?int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),默認為30分鐘。當session在30分鐘內沒有使用,那么Tomcat會在session池中移除這個session;
? ? ? ?void setMaxInactiveInterval(int interval):設置session允許的最大不活動時間(秒),如果設置為1秒,那么只要session在1秒內不被使用,那么session就會被移除;
? ? ? ?long getCreationTime():返回session的創建時間,返回值為當前時間的毫秒值;
? ? ? ?long getLastAccessedTime():返回session的最后活動時間,返回值為當前時間的毫秒值;
? ? ? ?void invalidate():讓session失效!調用這個方法會被session失效,當session失效后,客戶端再次請求,服務器會給客戶端創建一個新的session,并在響應中給客戶端新session的sessionId;
? ? ? ?boolean isNew():查看session是否為新。當客戶端第一次請求時,服務器為客戶端創建session,但這時服務器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新。
?
5 URL重寫
? ? ? ?我們知道session依賴Cookie,那么session為什么依賴Cookie呢?因為服務器需要在每次請求中獲取sessionId,然后找到客戶端的session對象。那么如果客戶端瀏覽器關閉了Cookie呢?那么session是不是就會不存在了呢?
? ? ? ?其實還有一種方法讓服務器收到的每個請求中都帶有sessioinId,那就是URL重寫!在每個頁面中的每個鏈接和表單中都添加名為jSessionId的參數,值為當前sessionid。當用戶點擊鏈接或提交表單時也服務器可以通過獲取jSessionId這個參數來得到客戶端的sessionId,找到sessoin對象。
index.jsp
| ? <body> <h1>URL重寫</h1> <a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' >主頁</a> ? <form action='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' method="post"> ??? <input type="submit" value="提交"/> </form> ? </body> |
? ? ? ?請求注意,在index.jsp后面使用的是分號,而不是問號,這是服務器對jsessionid這個參數的特殊要求。請求注意,在index.jsp后面使用的是分號,而不是問號,這是服務器對jsessionid這個參數的特殊要求。
? ? ? ?也可以使用response.encodeURL()對每個請求的URL處理,這個方法會自動追加jsessionid參數,與上面我們手動添加是一樣的效果。
| <a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主頁</a> ? <form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post"> ??? <input type="submit" value="提交"/> </form> |
?
? ? ? ?使用response.encodeURL()更加“智能”,它會判斷客戶端瀏覽器是否禁用了Cookie,如果禁用了,那么這個方法在URL后面追加jsessionid,否則不會追加。
總結
以上是生活随笔為你收集整理的会话跟踪技术之HttpSession的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaMelody开源系统性能监控软件
- 下一篇: MySQL定时任务event,储存过程(