全国咨询/投诉热线:400-618-4000

JAVA培训之配置session最大不活动时间

更新时间:2016年08月26日12时03分 来源:传智播客JAVA培训学院 浏览次数:

1.HttpSession的相关方法介绍

HttpSession对象是域对象,我们知道只要是域对象都会有三个方法:getAttribute()、setAttribute(String name,Object value)和removeAttribute(String name)。除了这三个方法,HttpSession接口还有其他方法,下面我们进行一一介绍。
1.1 获取session id方法
HttpSession接口中定义的获取session id的方法是:
  • String getId():返回分配给此会话的唯一标识符的字符串,标识符是由servlet容器即Tomcat服务器分配的,并且与实现相关。
下面我们来看请求信息中Cookie请求头的值,如图1-1所示:

图1-1 Cookie信息
由图1-1可知,JSESSION的值为3F95219AC8A0ADE5DB2D79C9A8850BA9,这个值就是session的id值,它是一个32位的十六进制的字符串。我们知道这个值是由服务器创建,并且每一次会话中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包下的一个类,通过调用它的一个静态的randomUUID()方法可以获得一个随机生成的UUID,然后将这个UUID转换成String类型,再进行一系列操作将它转换成与JSESSIONID类似的字符串。
(2)测试fun1()方法,运行结果如图1-2所示:

图1-2 控制台运行结果
图1-2中,第一行打印的是UUID转换后的字符串,该字符串中包含有“-”,使用String类的replace(char oldChar,char newChar)方法将“-”替换掉,再将返回的值转换成大写的字母,就得到了与JSESSIONID类似的32位十六进制字符串。
(3)我们可以将这个测试方法写成一个帮助类,以后需要UUID时可以直接调用该方法获得一个32位的十六进制的字符串。下面我们新建一个类,CommonUtils,在该类中新建一个静态的方法名字为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(),在该方法中调用CommonUtils类的uuid()方法获取一个uuid,例如:
@Test
    public void fun2(){
       System.out.println(CommonUtils.uuid());
    }
(5)测试fun2()方法,控制台打印结果如图1-3所示:

图1-3 控制台打印结果
每一次执行fun2()方法,控制台打印的结果都不相同,因为UUID类每次调用randomUUID()方法都会获得一个唯一的UUID。
1.2 获取session的最大不活动时间
HttpSession接口中定义的获取session最大不活动时间的方法是:
  • int getMaxInactiveInterval():
session默认的最大不活动时间是30分钟,表示:超过30分钟不使用session,服务器就会让这个session失效。可以使用setMaxInactiveInterval(int interval)方法设置session的最大不活动时间,该方法的参数的单位是秒,如果参数interval为负数则表示该session永远不会超时。
1.3使session失效的方法
HttpSession接口中定义了一个方法,该方法可以让当前session失效:
  • void invalidate():
该方法可以使session失效,所谓的失效是指session还存在,但是已经不能再使用了。当session失效后,客户端再次请求,服务器会创建一个新的session对象,并在响应中将新session的id值通过cookie传递给客户端。
1.4判断当前session是否是新的
HttpSession接口还提供了一个方法用来判断session是否是新的:
  • boolean isNew():
当客户端第一请求服务器时,服务器为本次会话创建一个session对象,这时服务器还没有将session的id值响应给客户端,那么这个session的状态就是新的,调用isNew()方法,返回值是true。我们知道调用request.getSession()方法服务器可能创建session,也可能返回一个session,那么调用以下方法:request.getSession().isNew()就可以判断当前session是服务器新创建的还是返回的。

2.配置session最大不活动时间

我们知道session的默认最大不活动时间是30分钟,那么这个时间是在哪里配置的?带着这个问题,我们来查看Tomcat安装目录下的conf/web.xml文件,如图1-4所示:

图1-4 web.xml
在图1-4中,配置的session最大不活动时间为30分钟,这个配置对Tomcat服务器中所有应用的session都有效,现在我们来配置针对某一个web应用的session最大不活动时间,如下所示:
(1)在Example24中,对web.xml文件内容做如下所示修改:
<?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文件,文件主要内容如例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发布到Tomcat服务器中,然后启动服务器,在浏览器端访问index.jsp页面,然后紧接着访问test.jsp页面,浏览器显示结果如图1-5所示:

图1-5 浏览器显示结果
(3)由图1-5可知,test属性的值取出了,然后在1分钟之后再次访问test.jsp页面,浏览器显示结果如图1-6所示:

图1-6 浏览器显示结果
由图1-6可知,已经无法从session中获取名称为test的域属性的值,浏览器输出结果为null。