session 过期怎么办

来源:互联网 发布:nginx负载均衡并发 编辑:程序博客网 时间:2024/04/28 21:58

前段时间遇到session过期问题

特地搜索了一下解决办法,记录一下:

session过期大体下面三种解决方法:

一.加长过期时间。

session-timeout(web.xml)元素与session.setMaxInactiveInterval()函数

a) web app server中,如websphere里可以设置超时时间为30分钟

b)在web.xml中的session-config配置

session-timeout元素(WEB.XML文件中的元素)用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果session-timeout元素的值为零或负数,则表示会话将永远不会超时。如:

<session-config><session-timeout>30</session-timeout></session-config>//30分钟

setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web的时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。


c) 在程序中手动设置
java 代码:

session.setMaxInactiveInterval(30 * 60);

想问两个问题:

一、它们的优先级?我想C应该最优先,但a和b 呢

二、如果一个应用的多个地方设置了不同的interval,会对session有影响吗?

如后台管理用户登录设置超时时间为30分钟,前台用户登录设置超时时间为15分钟。

此时的setMaxInactiveInterval是只影响servlet容器session的实例?还是影响整个容器(如果是这个,就有问题了),

不对,是可以设置的,三种方式设置:

1.在server.xml中定义context时采用如下定义:

<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>  

2.在web.xml中通过参数指定:

<session-config>       <session-timeout>30</session-timeout>     </session-config>  
其中30表示30分钟
3.在程序中通过servlet api直接修改
HttpSession ses = request.getSession();ses.setMaxInactiveInterval(10);
设置单位为秒,设置为-1永不过期。 

二.采用session存数据库的方案。

1,桌面——开始——运行——cmd
cd进入到“x:\WINDOWS\Microsoft.NET\Framework\v2.0.50727”
(不懂怎么操作cmd的,我也无奈了)

2,在cmd里继续写:
aspnet_regsql.exe -S 服务器ip -U 数据库登录名 -P 数据库密码 -d 所要放入的数据库 -ssadd -sstype c
例如
aspnet_regsql.exe -S 127.0.0.1 -U sa -P 7654321 -d StudentSession -ssadd -sstype c

所要放入的数据库:用你正在做的系统的数据库也可以,也可以写个新数据库。
例如我那条语句呀,我正在做一个学生系统,有个数据库student。
我想把session放入StudentSession 这个数据库里。
你执行完那句话就帮你创建好了这个数据库了,默认里边有几个表,和很多视图与存储过程。

三,在web.config里写

<sessionState mode="SQLServer"            sqlConnectionString="server=127.0.0.1; database=StudentSession ;uid=sa ;pwd=7654321;"            allowCustomSqlDatabase="True"            cookieless="false"            timeout="20" />

执行完这些之后,你对session的操作,就自动有了对这个数据库的操作了。
既然是自动的,当然你无须理会它,如何insert,你退出时如何delete了。
它自动完成了。

三.编写自动续约逻辑。

还有就是用在要保持session的页里设隐藏iframe每隔一段时间(这个时间小于session.timeout的时间)把涮新一次frame里的空页面!实现方法如下:


     在要保持session页里加上:

<iframe width=0 height=0src="SessionKeeper.aspx"></iframe>

     同目录下建一下SessionKeeper.aspx的文件。

<html><head>  <meta http-equiv="Refresh"content="900;url=sessionKeeper.aspx"> <!--每隔900秒刷新一下自己,为了和服务器通讯一下,保持session不会丢--></head></html>
       这种方法还是比较长见的,另外还有一种和上面类似的方法,不过他不是用meta自动涮新嵌套的iframe的方法。他是用javascript:window.setTimeout("functionname()",10000);第隔一段时间时间自动调用一个函数的方法,当然函数里还是要去连接一个空的文件。具体方法如下:

      在要保持session面里加上:

<script  id=Back language=javascript></script><script language=javascript> function keepsession(){ document.all["Back"].src="SessionKeeper.aspx?RandStr="+Math.random(); //这里的RandStr=Math.random只是为了让每次back.src的值不同,防止同一地址刷新无效的情况 window.setTimeout("keepsession()",900000); //每隔900秒调用一下本身  } keepsession();</script>
这样同一目录下建一个空内容的sessionKeeper.aspx就文件就可以了!

     还有一种方法用cookie,没有搜索到具体方法,好像ie和其他浏览器还是不同的,都不推荐使用的样子,这边就不写了,有兴趣的可以自己搜索,也可以在下面留言,共同学习,以上都是搜索过来的并没有实践过,所以出了问题,请不要找我,我只是代码的搬运工!

session 丢失

session丢失有许多许多种原因,没有什么人可以具体的穷举并防止,所以最好的方法是不要使用session,或者(当你肯定拥有服务器时)使用状态服务器来管理session(但是这要求你所有的对象都要设计为可序列化/反序列化的)。

在Session丢失时Session.SessionID并不会丢失,所以你可以结合SessionID与后台数据库自己来持久化保存会话数据。例如,可以使用“SessionID,要访问的数据的key”两个数据为索引关键值,从数据库读或者写数据值。这样,测试你的应用时,你可以随时把web.config文件重新保存一下,这样客户端发起请求时可以测试出Session中的数据就丢失了,但是你可以测试出将状态数据持久化到数据库了的解决方案可以让程序继续很好的运行。

在你的开发用的环境上你很难捕捉到session丢失的情况,但是在一个繁忙的生产服务器上其实这是经常发生的,例如可能往往是每隔不足10分钟session就会丢失。所以有经验的人在开发时就注重了session丢失问题。

有人说把用户登录信息保存到Session中,然后当Session丢失时就重定向到登录页面让用户重新登录。其实这是一个看似聪明实则体验不佳的方案。好的做法是不论session时候丢失,都不应该让用户去重新登录。

顺便说一下,如果数据库中的数据没有修改,就应该尽量避免重复读取数据库。刚刚编程,没有优化过的程序往往过于频繁、重复地读取数据库。适当地使用数据Cache,可以很好地提高程序运行效率,对于上面所说的使用数据库来保存会话信息也是这样。

以后来自sp1234的回帖内容~

1 0