gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章解决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中的属性来定义:

?
1
2
3
<session-config>
<session-timeout>失效时间</session-timeout>
</session-config>

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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,情况如下

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

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

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

主动添加cookie,设置保存目录与存活时间 。

?
1
2
3
4
5
6
7
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在浏览器关闭后失效问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:http://blog.csdn.net/No_Endless/article/details/51979768 。

最后此篇关于解决J2EE-session在浏览器关闭后失效问题的文章就讲到这里了,如果你想了解更多关于解决J2EE-session在浏览器关闭后失效问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com