日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

会话跟踪技术之HttpSession

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 会话跟踪技术之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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。