1.HttpSession的相關(guān)方法介紹
HttpSession對象是域?qū)ο?,我們知道只要是域?qū)ο蠖紩腥齻€方法:getAttribute()、setAttribute(String name,Object value)和removeAttribute(String name)。除了這三個方法,HttpSession接口還有其他方法,下面我們進行一一介紹。
1.1 獲取session id方法
HttpSession接口中定義的獲取session id的方法是:
- String getId():返回分配給此會話的唯一標識符的字符串,標識符是由servlet容器即Tomcat服務器分配的,并且與實現(xiàn)相關(guān)。
下面我們來看請求信息中Cookie請求頭的值,如圖1-1所示:
圖1-1 Cookie信息
由圖1-1可知,JSESSION的值為3F95219AC8A0ADE5DB2D79C9A8850BA9,這個值就是session的id值,它是一個32位的十六進制的字符串。我們知道這個值是由服務器創(chuàng)建,并且每一次會話中session的id值都是唯一的。其實我們自己也可以生成這樣的字符串,步驟如下所示:
(1)在一個web應用Example24中,新建一個Class類,UUIDTest,主要代碼如例1-1所示:
例1-1 UUIDTest.java
public class UUIDTest {
@Test
public void fun1() {
UUID uuid = UUID.randomUUID();
String string = uuid.toString();
System.out.println(string);
string = string.replace("-", "");
System.out.println(string);
string = string.toUpperCase();
System.out.println(string);
}
}
在例1-1中,UUID是java.util包下的一個類,通過調(diào)用它的一個靜態(tài)的randomUUID()方法可以獲得一個隨機生成的UUID,然后將這個UUID轉(zhuǎn)換成String類型,再進行一系列操作將它轉(zhuǎn)換成與JSESSIONID類似的字符串。
(2)測試fun1()方法,運行結(jié)果如圖1-2所示:
圖1-2 控制臺運行結(jié)果
圖1-2中,第一行打印的是UUID轉(zhuǎn)換后的字符串,該字符串中包含有“-”,使用String類的replace(char oldChar,char newChar)方法將“-”替換掉,再將返回的值轉(zhuǎn)換成大寫的字母,就得到了與JSESSIONID類似的32位十六進制字符串。
(3)我們可以將這個測試方法寫成一個幫助類,以后需要UUID時可以直接調(diào)用該方法獲得一個32位的十六進制的字符串。下面我們新建一個類,CommonUtils,在該類中新建一個靜態(tài)的方法名字為uuid(),主要代碼如例1-2所示:
例1-2 CommonUtils.java
public class CommonUtils {
public static String uuid(){
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}
}
(4)有了這個幫助類,我們就可以在例1-1中的UUIDTest類中再定義一個測試方法fun2(),在該方法中調(diào)用CommonUtils類的uuid()方法獲取一個uuid,例如:
@Test
public void fun2(){
System.out.println(CommonUtils.uuid());
}
(5)測試fun2()方法,控制臺打印結(jié)果如圖1-3所示:
圖1-3 控制臺打印結(jié)果
每一次執(zhí)行fun2()方法,控制臺打印的結(jié)果都不相同,因為UUID類每次調(diào)用randomUUID()方法都會獲得一個唯一的UUID。
1.2 獲取session的最大不活動時間
HttpSession接口中定義的獲取session最大不活動時間的方法是:
- int getMaxInactiveInterval():
session默認的最大不活動時間是30分鐘,表示:超過30分鐘不使用session,服務器就會讓這個session失效??梢允褂胹etMaxInactiveInterval(int interval)方法設置session的最大不活動時間,該方法的參數(shù)的單位是秒,如果參數(shù)interval為負數(shù)則表示該session永遠不會超時。
1.3使session失效的方法
HttpSession接口中定義了一個方法,該方法可以讓當前session失效:
該方法可以使session失效,所謂的失效是指session還存在,但是已經(jīng)不能再使用了。當session失效后,客戶端再次請求,服務器會創(chuàng)建一個新的session對象,并在響應中將新session的id值通過cookie傳遞給客戶端。
1.4判斷當前session是否是新的
HttpSession接口還提供了一個方法用來判斷session是否是新的:
當客戶端第一請求服務器時,服務器為本次會話創(chuàng)建一個session對象,這時服務器還沒有將session的id值響應給客戶端,那么這個session的狀態(tài)就是新的,調(diào)用isNew()方法,返回值是true。我們知道調(diào)用request.getSession()方法服務器可能創(chuàng)建session,也可能返回一個session,那么調(diào)用以下方法:request.getSession().isNew()就可以判斷當前session是服務器新創(chuàng)建的還是返回的。
2.配置session最大不活動時間
我們知道session的默認最大不活動時間是30分鐘,那么這個時間是在哪里配置的?帶著這個問題,我們來查看Tomcat安裝目錄下的conf/web.xml文件,如圖1-4所示:
圖1-4 web.xml
在圖1-4中,配置的session最大不活動時間為30分鐘,這個配置對Tomcat服務器中所有應用的session都有效,現(xiàn)在我們來配置針對某一個web應用的session最大不活動時間,如下所示:
(1)在Example24中,對web.xml文件內(nèi)容做如下所示修改:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<session-config>
<session-timeout>1</session-timeout>
</session-config>
... ...
</web-app>
如上所示,設置Example24應用中的session的最大不活動時間為1分鐘,下面我們來測試一下是否有效。
(2)在應用的WebRoot目錄下新建一個test.jsp文件,文件主要內(nèi)容如例1-3所示:
<body>
This is my JSP page. <br>
<%
String test=(String)session.getAttribute("test");
out.print("從session中獲取的test的值:"+test);
%>
</body>
例1-3中,從session中獲取名為test的屬性的值,并向瀏覽器端輸出。
(3)對應用中的index.jsp稍作修改,如例1-4所示:
例1-4 index.jsp
<body>
This is my JSP page. <br>
<%
session.setAttribute("test", "hello");
%>
</body>
例1-4中,向session中保存了名為test的屬性,值為:hello。
(2)將Example24發(fā)布到Tomcat服務器中,然后啟動服務器,在瀏覽器端訪問index.jsp頁面,然后緊接著訪問test.jsp頁面,瀏覽器顯示結(jié)果如圖1-5所示:
圖1-5 瀏覽器顯示結(jié)果
(3)由圖1-5可知,test屬性的值取出了,然后在1分鐘之后再次訪問test.jsp頁面,瀏覽器顯示結(jié)果如圖1-6所示:
圖1-6 瀏覽器顯示結(jié)果
由圖1-6可知,已經(jīng)無法從session中獲取名稱為test的域?qū)傩缘闹担瑸g覽器輸出結(jié)果為null。