一、什么是Session,如何使用?
Session是用於存放用戶與web服務器之間的會話,即服務器為客戶端開辟的存儲空間。
由於客戶端與服務器之間的會話是無狀態的機制,Session則可用於關聯訪問,因此多用與用戶登錄等功能上。
我們可以調用request的getsession()方法來使用session,通過setAttribute()注入值:
//引號中的"xxx"為頁面中name標簽里的值,逗號后面的是Servlet中的變量名。 request.getSession().setAttribute("xxx",xxx);//儲存到session中
之后可以用getAttribute()方法來獲取session中的值:
request.getSession().getAttribute("xxx",xxx);//讀取session中的值
若要移除Session中特定的值,可以調用removeAttribute方法,但request中的SessionID仍不變,只是其中的值發生了改變,Session還是原來的Session。
request.getSession().removeAttribute("xxx");
[注]:無狀態的意思是會話之間無關聯性,無法識別該用戶曾經訪問過。
二、Session的意義何在?
Session存在的意義是為了提高安全性,它將關鍵數據存在服務器端。與cookie不同,cookie則是將數據存在客戶端的瀏覽器中。
因此cookie是較為危險的,若客戶端遭遇黑客攻擊,信息容易被竊取,數據也可能被篡改,而運用Session可以有效避免這種情況的發生。
三、Session的生命周期
Session存儲在服務器的內存中(為了高速存取)。
Session何時生效
Sessinon在用戶訪問第一次訪問服務器時創建,需要注意只有訪問JSP、Servlet等程序時才會創建Session,只訪問HTML、IMAGE等靜態資源並不會創建Session,可調用request.getSession(true)強制生成Session。
Session何時失效
1.服務器會把長時間沒有活動的Session從服務器內存中清除,此時Session便失效。Tomcat中Session的默認失效時間為20分鍾。
2.調用Session的invalidate方法。
HttpSession session = request.getSession(); session.invalidate();//注銷該request的所有session
3.session的過期時間是從什么時候開始計算的?是從一登錄就開始計算還是說從停止活動開始計算?
答:從session不活動的時候開始計算,如果session一直活動,session就總不會過期。
從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0;
4.設置session的失效時間
a)web.xml中
<session-config> <session-timeout>30</session-timeout> </session-config>
b)在程序中手動設置
session.setMaxInactiveInterval(30 * 60);//設置單位為秒,設置為-1永不過期
request.getSession().setMaxInactiveInterval(-1);//永不過期
c)tomcat也可以修改session過期時間,在server.xml中定義context時采用如下定義:
<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>
[注]:若要移除Session中特定的值,可以調用removeAttribute方法,但request中的SessionID仍不變,只是其中的值發生了改變,Session還是原來的Session。↓↓↓↓↓↓↓↓
request.getSession().removeAttribute("xxx");
四、Session的工作原理
雖然Session保存在服務器,對客戶端是透明的,它的正常運行仍然需要客戶端瀏覽器的支持。這是因為Session需要使用Cookie作為識別標志。HTTP協議是無狀態的,Session不能依據HTTP連接來判斷是否為同一客戶,因此服務器向客戶端瀏覽器發送一個名為JSESSIONID的Cookie,它的值為該Session的id(也就是HttpSession.getId()的返回值)。Session依據該Cookie來識別是否為同一用戶。
該Cookie為服務器自動生成的,它的maxAge屬性一般為-1,表示僅當前瀏覽器內有效,並且各瀏覽器窗口間不共享,關閉瀏覽器就會失效。因此同一機器的兩個瀏覽器窗口訪問服務器時,會生成兩個不同的Session。但是由瀏覽器窗口內的鏈接、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標等打開的窗口)除外。這類子窗口會共享父窗口的Cookie,因此會共享一個Session。
注意:新開的瀏覽器窗口會生成新的Session,但子窗口除外。子窗口會共用父窗口的Session。例如,在鏈接上右擊,在彈出的快捷菜單中選擇”在新窗口中打開”時,子窗口便可以訪問父窗口的Session。
如果客戶端瀏覽器將Cookie功能禁用,或者不支持Cookie怎么辦?例如,絕大多數的手機瀏覽器都不支持Cookie。Java Web提供了另一種解決方案:URL地址重寫。
URL地址重寫是對客戶端不支持Cookie的解決方案。URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務器能夠解析重寫后的URL獲取Session的id。這樣即使客戶端不支持Cookie,也可以使用Session來記錄用戶狀態。HttpServletResponse類提供了encodeURL(String url)實現URL地址重寫,該方法會自動判斷客戶端是否支持Cookie。如果客戶端支持Cookie,會將URL原封不動地輸出來。如果客戶端不支持Cookie,則會將用戶Session的id重寫到URL中。
注意:TOMCAT判斷客戶端瀏覽器是否支持Cookie的依據是請求中是否含有Cookie。盡管客戶端可能會支持Cookie,但是由於第一次請求時不會攜帶任何Cookie(因為並無任何Cookie可以攜帶),URL地址重寫后的地址中仍然會帶有jsessionid。當第二次訪問時服務器已經在瀏覽器中寫入Cookie了,因此URL地址重寫后的地址中就不會帶有jsessionid了。