教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

JAVA培訓(xùn)之配置session最大不活動(dòng)時(shí)間

更新時(shí)間:2016年08月26日12時(shí)03分 來源:傳智播客JAVA培訓(xùn)學(xué)院 瀏覽次數(shù):

1.HttpSession的相關(guān)方法介紹

HttpSession對(duì)象是域?qū)ο?,我們知道只要是域?qū)ο蠖紩?huì)有三個(gè)方法:getAttribute()、setAttribute(String name,Object value)和removeAttribute(String name)。除了這三個(gè)方法,HttpSession接口還有其他方法,下面我們進(jìn)行一一介紹。
1.1 獲取session id方法
HttpSession接口中定義的獲取session id的方法是:
  • String getId():返回分配給此會(huì)話的唯一標(biāo)識(shí)符的字符串,標(biāo)識(shí)符是由servlet容器即Tomcat服務(wù)器分配的,并且與實(shí)現(xiàn)相關(guān)。
下面我們來看請(qǐng)求信息中Cookie請(qǐng)求頭的值,如圖1-1所示:

圖1-1 Cookie信息
由圖1-1可知,JSESSION的值為3F95219AC8A0ADE5DB2D79C9A8850BA9,這個(gè)值就是session的id值,它是一個(gè)32位的十六進(jìn)制的字符串。我們知道這個(gè)值是由服務(wù)器創(chuàng)建,并且每一次會(huì)話中session的id值都是唯一的。其實(shí)我們自己也可以生成這樣的字符串,步驟如下所示:
(1)在一個(gè)web應(yīng)用Example24中,新建一個(gè)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包下的一個(gè)類,通過調(diào)用它的一個(gè)靜態(tài)的randomUUID()方法可以獲得一個(gè)隨機(jī)生成的UUID,然后將這個(gè)UUID轉(zhuǎn)換成String類型,再進(jìn)行一系列操作將它轉(zhuǎn)換成與JSESSIONID類似的字符串。
(2)測(cè)試fun1()方法,運(yùn)行結(jié)果如圖1-2所示:

圖1-2 控制臺(tái)運(yùn)行結(jié)果
圖1-2中,第一行打印的是UUID轉(zhuǎn)換后的字符串,該字符串中包含有“-”,使用String類的replace(char oldChar,char newChar)方法將“-”替換掉,再將返回的值轉(zhuǎn)換成大寫的字母,就得到了與JSESSIONID類似的32位十六進(jìn)制字符串。
(3)我們可以將這個(gè)測(cè)試方法寫成一個(gè)幫助類,以后需要UUID時(shí)可以直接調(diào)用該方法獲得一個(gè)32位的十六進(jìn)制的字符串。下面我們新建一個(gè)類,CommonUtils,在該類中新建一個(gè)靜態(tài)的方法名字為uuid(),主要代碼如例1-2所示:
例1-2 CommonUtils.java
public class CommonUtils {
  public static String uuid(){
      return UUID.randomUUID().toString().replace("-", "").toUpperCase();
  }
}
(4)有了這個(gè)幫助類,我們就可以在例1-1中的UUIDTest類中再定義一個(gè)測(cè)試方法fun2(),在該方法中調(diào)用CommonUtils類的uuid()方法獲取一個(gè)uuid,例如:
@Test
    public void fun2(){
       System.out.println(CommonUtils.uuid());
    }
(5)測(cè)試fun2()方法,控制臺(tái)打印結(jié)果如圖1-3所示:

圖1-3 控制臺(tái)打印結(jié)果
每一次執(zhí)行fun2()方法,控制臺(tái)打印的結(jié)果都不相同,因?yàn)閁UID類每次調(diào)用randomUUID()方法都會(huì)獲得一個(gè)唯一的UUID。
1.2 獲取session的最大不活動(dòng)時(shí)間
HttpSession接口中定義的獲取session最大不活動(dòng)時(shí)間的方法是:
  • int getMaxInactiveInterval():
session默認(rèn)的最大不活動(dòng)時(shí)間是30分鐘,表示:超過30分鐘不使用session,服務(wù)器就會(huì)讓這個(gè)session失效。可以使用setMaxInactiveInterval(int interval)方法設(shè)置session的最大不活動(dòng)時(shí)間,該方法的參數(shù)的單位是秒,如果參數(shù)interval為負(fù)數(shù)則表示該session永遠(yuǎn)不會(huì)超時(shí)。
1.3使session失效的方法
HttpSession接口中定義了一個(gè)方法,該方法可以讓當(dāng)前session失效:
  • void invalidate():
該方法可以使session失效,所謂的失效是指session還存在,但是已經(jīng)不能再使用了。當(dāng)session失效后,客戶端再次請(qǐng)求,服務(wù)器會(huì)創(chuàng)建一個(gè)新的session對(duì)象,并在響應(yīng)中將新session的id值通過cookie傳遞給客戶端。
1.4判斷當(dāng)前session是否是新的
HttpSession接口還提供了一個(gè)方法用來判斷session是否是新的:
  • boolean isNew():
當(dāng)客戶端第一請(qǐng)求服務(wù)器時(shí),服務(wù)器為本次會(huì)話創(chuàng)建一個(gè)session對(duì)象,這時(shí)服務(wù)器還沒有將session的id值響應(yīng)給客戶端,那么這個(gè)session的狀態(tài)就是新的,調(diào)用isNew()方法,返回值是true。我們知道調(diào)用request.getSession()方法服務(wù)器可能創(chuàng)建session,也可能返回一個(gè)session,那么調(diào)用以下方法:request.getSession().isNew()就可以判斷當(dāng)前session是服務(wù)器新創(chuàng)建的還是返回的。

2.配置session最大不活動(dòng)時(shí)間

我們知道session的默認(rèn)最大不活動(dòng)時(shí)間是30分鐘,那么這個(gè)時(shí)間是在哪里配置的?帶著這個(gè)問題,我們來查看Tomcat安裝目錄下的conf/web.xml文件,如圖1-4所示:

圖1-4 web.xml
在圖1-4中,配置的session最大不活動(dòng)時(shí)間為30分鐘,這個(gè)配置對(duì)Tomcat服務(wù)器中所有應(yīng)用的session都有效,現(xiàn)在我們來配置針對(duì)某一個(gè)web應(yīng)用的session最大不活動(dòng)時(shí)間,如下所示:
(1)在Example24中,對(duì)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>
如上所示,設(shè)置Example24應(yīng)用中的session的最大不活動(dòng)時(shí)間為1分鐘,下面我們來測(cè)試一下是否有效。
(2)在應(yīng)用的WebRoot目錄下新建一個(gè)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的屬性的值,并向?yàn)g覽器端輸出。
(3)對(duì)應(yīng)用中的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服務(wù)器中,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問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ū)傩缘闹?,瀏覽器輸出結(jié)果為null。
0 分享到:
和我們?cè)诰€交談!