乐鱼电竞


  • 教育行业A股IPO第一股(股票代码 003032)

    全国咨询/投诉热线: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。
    0 分享到:
    和我们在线交谈!
    【网站地图】【sitemap】