众所周知,当用户登录网站后较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时,导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。
防止session超时,我们一般采用的方式有两种:1、延迟session超时时间 2、(在规定的session超时时间内)隔一定时间与服务器交互。
一、 延长服务器的session超时时间。ps:在Tomcat服务器的WEB.xml有如下节点内容:
<session-config><session-timeout>30</session-timeout></session-config>;
这里的30表示session的超时时间,单位为分钟,如果用户登录后在30分钟内没有与服务器交互,
那么当前用户的session将失效。我们可以配置一个更大的数值(比如60),
就可以延长session的超时时间,如果将该值改为0或负数的话,则表示session永不失效。
不过在实际的工作应用中,一味地上调session的超时时间设置并不怎么常见,
大多数需要实现该功能的网站都将解决问题的焦点集中在另一种思路上。
例如:一些在线网站均采用定时刷新页面的方法来防止session超时。
二、定时刷新页面。最常见的有两种实现方式:一种是通过JavaScript+HTMLDOM,另一种则是通过meta标签来实现。
1)JavaScript+HTMLDOM,示例代码如下:
function refresh(seconds) { setTimeout("self.location.reload()",seconds*1000); } refresh(600);//调用方法启动定时刷新,数值单位:秒。
2)通过meta标签来实现(在页面中添加meta标签refresh也可以指定每隔指定时间就刷新当前页面),示例代码如下:
<metahttp-equiv="refresh"content="600"/>
上述meta标签可以实现每过600秒就刷新一次当前页面。
在上述两种方案中,较好的为第二种,因为如果当前页面是在IE浏览器的模式窗口中打开的,默认情况下,
self.location.reload()方法将会失效,而refreshmeta标签在IE模式窗口下仍然有效。
上述两种方式都实现了刷新当前页面,并且使用起来非常简单,不过很遗憾的是,它们存在一种几乎致命的缺陷。试想一下,如果在论坛发帖等需要用户输入内容的页面,用户花费较长的时间输 入了许多文本内容,可是突然遇到了一个定时页面刷新,结果用户输入的所有内容都没了,估计这个时候用户连掐死你的心都有了……
因此我们需要在当前页面本身不刷新、不影响用户的任何操作的情况下实现定时刷新。最常见的解决方法仍然有两种。
1、在当前页面添加一个隐藏的iframe,然后在该iframe里面实现定时刷新。
2、使用JavaScript Image对象来实现定时刷新,(服务器的响应可以是文字等非图片内容,非图片内容只会造成图像加载失败,而我们的图像标签本身就是隐藏的,不管是加载成功还是失败都不 会显示,毕竟我们的主要目的是发送请求给服务器,让服务器保持session处于活动状态。)
3、使用Ajax来实现定时刷新。
使用说明: