有没有办法在没有(用户交互)*的情况下检测会话超时,并将其重定向到某个页面;即,如果在特定持续时间内页面上没有活动,服务器会检测到它并自动将其重定向到其他页面。
通过用户用户交互,我的意思是;有一种方法可以检测会话超时,当用户单击某个东西时,然后一些请求进入服务器,然后服务器检查当前用户会话是否过期。
这里我需要的是我们不通知服务器任何东西(或者我们不执行任何操作),但是当会话过期时,服务器会自动检测到它并执行所需的操作。
谢谢,Raza
发布于 2010-10-12 22:55:02
当然,您可以在JavaScript中通过实现文档范围内的键盘和/或鼠标侦听器以及带超时的周期性方法来完成这项工作。
var timeOut = 1000 * 60 * 30; // 30 minutes
var lastActivity = new Date().getTime();
var checkTimeout;
checkTimeOut = function(){
if(new Date().getTime() > lastActivity + timeOut){
// redirect to timeout page
}else{
window.setTimeout(checkTimeOut, 1000); // check once per second
}
}现在,您的全局侦听器只需在每个操作上将lastActivity设置为当前时间。
在重新阅读问题时,您希望使用来自应用程序服务器的实际会话超时。这是一个困难的问题,因为当您向服务器发送ajax请求时,实际上会阻止会话过期(除非有硬限制),所以我的答案可能仍然是最好的方法。
发布于 2011-09-17 13:42:35
如果要求在会话超时后只重定向到登录页面(或任何其他页面),我尝试这样实现:
将以下scriptlet包含到所有需要登录页面
<%
int timeout = session.getMaxInactiveInterval();
response.setHeader("Refresh", timeout + "; URL = login.jsp");
%>这样,在会话超时后,任何需要登录的页面都会刷新/重定向到login.jsp (将其更改为所需的url)
或者(为了避免遗漏任何页面)
实际上,您可以将它写在一个单独的文件(timedoutRedirect.jsp)中,并使用"JSP property group“(在web.xml中)将它作为头文件包含到所有需要登录的页面中。
<jsp-property-group>
<display-name>all jsp</display-name>
<url-pattern>/users/*</url-pattern>
<include-prelude>/timedoutRedirect.jsp</include-prelude>
</jsp-property-group>(您可能需要根据您的项目规格调整前奏url )
发布于 2011-05-05 23:38:32
我也遇到了同样的问题,所以下面是我如何解决它的。
基本上,我用javascript在客户端创建了一个会话计时器。我定期发送一个ajax调用(计时器小于实际的服务器超时设置),以使会话在服务器上保持活动状态。
然后,我创建了另一个在客户端倒计时的计时器(设置为与实际服务器超时设置相同的时间)。如果计时器超时,就会向运行session.invalidate()的服务器发出ajax调用,然后转到登录页面。此计时器会在每次执行某些操作(如鼠标单击、按键等)时重置。
https://stackoverflow.com/questions/3915787
复制相似问题