日期:2014-05-17  浏览次数:20823 次

session里的数据为什么无缘无故丢失?
session中保存了一个的id值,许多业务逻辑要根据这个id值来处理,所以许多页面要从session里获取这个值,但是令人纠结的是有时候总是取不到,没有session.remove ,session也米有过期。后来加了个session的监听器发现有时候自己就把这个值给清除了。总是这样用,从来没遇到过这中问题,我的世界观都被颠覆了。。求救!

------解决方案--------------------
1、InProc
session存储在进程内,即inetinfo.exe这个进程中。
2、SQLServer
会话状态将使用进程外 SQL Server 数据库来存储状态信息。
3、StateServer
会话状态将使用进程外 ASP.NET 状态服务来存储状态信息。
而IIS默认是以InProc方式来存储session的,即存储在 IIS进程中,也就是inetinfo.exe这个进程。当inetinfo.exe进程不稳定或崩溃时,这些信息也就会丢失。另外,当IIS关闭,重启时Session信息也会丢失。
查看session配置的存储方式,用地3种比较好一些,一般的丢失问题都可以避免。
------解决方案--------------------
中间件不会有这样的问题。

一般两种可能性:
1、无意中对session该属性set了null;
2、JSessionID发生了变化,多半出在集群环境下;


你是用的:HttpSessionAttributeListener 来做属性监听么?

那么在清除的事件中,你这么做:
Throwable stack = new Throwable();
stack.printStackTrace(); 
在打印出来的堆栈信息,看看究竟是哪个类的那句话,把属性给remove 或者 set了null。