J2EE-session在浏览器关闭后失效问题

session在浏览器关闭后失效问题

前几天在做一个签到系统时,遇到了喜闻乐见的session问题,项目为Spring+SpringMVC+Mybatis框架,maven管理目录的javaweb端系统,对于session的一些问题,作出以下分析,在这里,着重讨论session生命周期的问题,至于其他定义,不做解释:


  1. 首先,说明一下session的生命周期:

    存储:Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。在一个javaweb应用中,可调用request.getSession(boolean xxx)生成Session。注意,boolean型参数为true时,在此处强制生成一个新的session。

    • session失效时间:
      距离上一次使用该session的时间达到设置的失效时间,session失效
    • 还有一种是方法 session.invalidate()被执行,主动使得session失效
      对于失效时间,可以通过配置web.xml中的属性来定义:
  <session-config>
    <session-timeout>失效时间</session-timeout>
  </session-config>

失效时间单位为分钟,若要使session有效时间为一天,则可以设为60*24,当设置为0或负数时,session永久有效,根据失效时间的定义,很容易理解这一情况。


session为什么在浏览器关闭之后失效了?

  • 未设置session失效时间,默认为浏览器关闭后失效;
  • 大部分的session机制都是采用进程中的cookie来保存sessionid的,也就是JSESSIONID,浏览器关闭后进程消失,进程中的cookie消失,那么sessionid也就跟着消失了。


    根据已知的内容,写了一个简单的例子:

@Controller
public class SessionTest {

    @RequestMapping("/sessionTest")
    public String sessionTest(HttpServletRequest request, HttpServletResponse response){

        System.out.println("success!");
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(259200);

        request.setAttribute("creationtime",session.getCreationTime());//创建时间
        request.setAttribute("id",session.getId());//id
        request.setAttribute("max",session.getMaxInactiveInterval(-1));//最大失效时间
        //在这里,MaxInactiveInterval的优先级高于web.xml中的session-cofig,单位为秒
        request.setAttribute("lasttime",session.getLastAccessedTime());//上次使用时间
        request.setAttribute("sessionTest",session);
//        System.out.println(session.getCreationTime());
//        System.out.println(session.getMaxInactiveInterval());
//        System.out.println(session.getLastAccessedTime());

        return "page/showSession";
    }

    <table border="1" cellspacing="0" cellpadding="0">
        <tr><td>创建时间:</td><td>${creationtime}</td></tr>
        <tr><td>id:</td><td>${id}</td></tr>
        <tr><td>最大存活时间:</td><td>${max}</td></tr>
        <tr><td>上次使用时间:</td><td>${lasttime}</td></tr>
        <tr><td>session:</td><td>${sessionTest}</td></tr>
    </table>

解析:

  • 上面的代码模拟了一次登录情况,控制器中,创建了一个HttpSession对象,基本设置了所有能设置的参数,
  • 但是在浏览器关闭后,再次进入主页面时,还是需要再次登录,说明浏览器端是没有再次拿到这个session对象的,我们可以在chrome浏览器的设置->显示高级设置->隐私设置的内容设置->所有cookie与网站数据中,搜索本地tomcat服务器去查看本次存入的session,即一个名为JSESSIONID的cookie,情况如下
    浏览器情况
    输出

可见,session的失效时间其实还是在浏览器关闭时,所以只有浏览器不关闭再次访问的情况,才能继续使用登录状态,到底上面我们所设置的失效时间代表的是什么?

浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了,我的理解是,失效时间只生效在一次会话过程中,若浏览器关闭,会话结束,其实失效时间设置为永久有效,就是到浏览器关闭,会话关闭的那个时刻。要解决这个问题,可以把cookie与session混用,有这么的笨办法:

  • 主动添加Cookie,设置保存目录与存活时间
public static void addCookie(String name, String value, int age, HttpServletResponse response) throws
            UnsupportedEncodingException {
        Cookie c = new Cookie(name, URLEncoder.encode(value, "utf-8"));
        c.setMaxAge(age);
        c.setPath(path);
        response.addCookie(c);
    }

在再次访问时,使用Cookie[] cookies = request.getCookies();遍历cookie,根据cookie的名字获取想要的cookie,也可说是session,最后,得到了自己想要的结果,session(这个名为JSESSIONID的cookie)逃出了浏览器的监禁。

确实,对于浏览器内部的session选择实现,我还没有理解透彻,希望大牛能够帮助我。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值