解决J2EE-session在浏览器关闭后失效问题
前几天在做一个签到系统时,遇到了喜闻乐见的session问题,项目为Spring+SpringMVC+Mybatis框架,maven管理目录的javaweb端系统,对于session的一些问题,作出以下分析,在这里,着重讨论session生命周期的问题,至于其他定义,不做解释: 首先,说明一下session的生命周期: 存储:Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。在一个javaweb应用中,可调用request.getSession(boolean xxx)生成Session。注意,boolean型参数为true时,在此处强制生成一个新的session。 1.session失效时间: 距离上一次使用该session的时间达到设置的失效时间,session失效 2.还有一种是方法 session.invalidate()被执行,主动使得session失效 对于失效时间,可以通过配置web.xml中的属性来定义: <session-config> <session-timeout>失效时间</session-timeout> </session-config> 失效时间单位为分钟,若要使session有效时间为一天,则可以设为60*24,当设置为0或负数时,session永久有效,根据失效时间的定义,很容易理解这一情况。 session为什么在浏览器关闭之后失效了?
根据已知的内容,写了一个简单的例子: @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> 解析:
可见,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); } 在再次访问时,使用 总结 以上所述是小编给大家介绍的解决J2EE-session在浏览器关闭后失效问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |