Session过期问题

SessionState   的Timeout),其主要原因有三种。  
  一:有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。  
  二:程序内部里有让Session掉失的代码,及服务器内存不足产生的。  
  三:程序有框架页面和跨域情况。  
  第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时自己也不要去编辑它)  
  第二种是检查代码有无Session.Abandon()之类的。  
  第三种是在Window服务中将ASP.NET   State   Service   启动。  
   
  http://community.csdn.net/Expert/topic/3100/3100218.xml?temp=.4426386  
  还有可能就是你在测试期间改动了,网站的文件。  


1、前面有朋友说的设置Session.TimeOut,个人认为不是好办法(而Timeout   =   -1   我没试过)。但是不像有的朋友说的那样,会导致服务器崩溃——除非有很多访问者一直开着浏览器,导致“在线”session太多超出了服务器的承受极限。  
  2、cookie可以解决一定的问题。从技术上来说,IIS提供的Session其实就是依靠Cookie来实现的——你可以通过session.timeout修改Session的cookie的  
  超时时间。但是Session的cookie一旦关闭浏览器就自动终止了,所以除非用户像1所说那样一直开着浏览器——僵尸,呵呵。弄清楚这一点,你可以将cookie写入用户端,比如保存名字密码一天、一个月等等。这样做,需要考虑一定的安全风险——比如有很多用户在网吧,有用户共用一台电脑等等,需要设计一个比较完整的登录/退出登录机制。  
  3、刷新。无论如何,我是采用这样的方法的。楼上有朋友说到,可以用隐藏的frame来刷新。后来也有朋友说到,刷新如果失败就会停止。这都是正确的,不过有几种方式可以实现自动刷新:  
  第一种,ASP的   Response.AddHeader   方法,添加一个   REFRESH   的Header  
  第二种,html的<meta   >,在html中输出  
  <meta   http-equiv="Refresh"   content="3;URL='keep.asp'">,其原理和上一个方法一样。  
  第三种,javaScript  
          头三种方法都是一样的,依靠刷新。可是为什么会出现刷新失败就停止呢?呵呵,那是因为那位朋友的页面A去刷新自己,而促使页面A刷新自己的方法需要页面A自己来调用。也就是自己调用自己,一旦调用失败一次,就无法继续了——像递归一样。  
  如果在页面里面用javascript写一个setTimeout或者interval方法,让某个frame去不断刷新(刷新什么无所谓,保持连接就行),这样,只要该页面一直在就不过期咯。这样的方式比较适合BBS中或者聊天室的最上面的广告区域(所有页面可以共用的部分)。  
   
  4、不用iis的session,用自己的session。这要说说什么是Session“会话”了。会话这个概念不是iis才有,只是iis提供了这样的技术实现。用户连接到iis服务器,服务器随机生成一个不重复的key给用户浏览器,记到cookie中。同时,所有通过asp写入session对象的数据都保存在服务器端,至于谁能访问这些数据?取决于谁拿着正确的key——也就是该用户的浏览器。这一切,iis和浏览器在后台完成了,所以我们没注意到。正是为了做到神不知鬼不觉,iis选择了用cookie的方式偷偷的来回传递那个key,那么,如果浏览器关了cookie,Session也就失效了。如果我们自己做自己的Session,原理一样。在用户登录或者连接的时候分配一个key,保存到数据库,并定期或者在接到用户的请求的时候检查这个key是否已经过期。至于用什么方式传递这个key,就看方便了:可以用cookie,这样不容易被看到;可以写在web里面,用隐藏的form提交,这样比较麻烦;可以带在访问url的后面作为参数,这样看起来有点乱。但是好处在于:三种传参方式灵活使用,不依赖于cookie和iis的session,还可以在多台服务器之间保持“会话”。不过要这么做,应该在系统设计的时候就做出决定,因为有一定的技术和开发成本投入。  
  5、带着参数走  
  这就是上面方法的折衷版本,上面有朋友其实已经提到了。显示当前页面的时候,就把参数写到页面的隐藏的表单或者javascript变量,提交发言内容的时候,虽然iis的session过期了,但是需要的参数都还在。这样,就不用考虑用户的浏览器是否支持cookie。呵呵,不太好的地方还是一样的:有些敏感信息存在web的源代码中...  
   
  所以咯,遇到必须考虑过期问题的时候,我还是喜欢用javascript刷新方式。偷懒的话,就用cookie。不过我们的系统都有自己的Session,所以一般来说我只需要在页面里面或者url上带上SessionKey就好了。   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot项目中,session过期时间可以通过配置文件进行设置。具体来说,可以在application.properties或application.yml中添加如下配置: 1. 在application.properties中添加: ``` server.servlet.session.timeout=30m ``` 这里的30m表示session过期时间为30分钟。 2. 在application.yml中添加: ``` server: servlet: session: timeout: 30m ``` 这样配置后,session过期时间将被设置为30分钟。当用户在一段时间内没有与服务器进行交互时,session将会过期,并且需要重新登录。 另外,还可以通过设置session过期策略来自定义session过期时间。可以通过实现`HttpSessionListener`接口,并在`sessionCreated`方法中设置过期时间。具体实现如下: ```java import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent event) { event.getSession().setMaxInactiveInterval(1800); // 设置过期时间为30分钟 } @Override public void sessionDestroyed(HttpSessionEvent event) { // Session销毁时的操作 } } ``` 然后,在Spring Boot的配置类中注册该监听器: ```java import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SessionConfig { @Bean public ServletListenerRegistrationBean<SessionListener> sessionListener() { ServletListenerRegistrationBean<SessionListener> registrationBean = new ServletListenerRegistrationBean<>(); registrationBean.setListener(new SessionListener()); return registrationBean; } } ``` 通过以上两种方式,可以在Spring Boot项目中设置session过期时间,并对其进行灵活的控制。请根据具体需求选择合适的方法来解决session过期问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值