解决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为什么在浏览器关闭之后失效了?

  • 未设置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)逃出了浏览器的监禁。

总结

以上所述是小编给大家介绍的解决J2EE-session在浏览器关闭后失效问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340