会话过期/超时后的JSP自动重定向

use*_*445 6 java jsp session-timeout

有没有办法在没有(用户交互)*的情况下检测会话超时,并将其重定向到某个页面; 即如果页面@特定持续时间没有活动; 服务器检测到它并在其他一些上自动重定向.

通过用户用户交互我的意思是; 有一种方法可以在用户点击某些内容时检测会话超时,然后一些请求转到服务器,然后服务器检查当前用户会话是否过期.

我需要的是我们不通知任何服务器(或者我们不执行任何操作),但是当会话到期时,服务器会自动检测到它并执行所需的操作.

谢谢,拉扎

小智 7

如果要求是在会话超时后重定向到登录页面(或任何其他页面),这就是我尝试实现它的方式:

将以下scriptlet包含在需要登录的所有页面中

<%
int timeout = session.getMaxInactiveInterval();
response.setHeader("Refresh", timeout + "; URL = login.jsp");
%>
Run Code Online (Sandbox Code Playgroud)

这样,任何需要登录的页面都会在会话超时后刷新/重定向到login.jsp(将其更改为所需的URL)

或(以避免遗漏任何页面)

你可以把它实际编写在一个单独的文件(timedoutRedirect.jsp),并把它作为使用"JSP属性组"头到所有页面需要登录(在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>
Run Code Online (Sandbox Code Playgroud)

(您可能需要根据项目规范调整前奏网址)


Sea*_*oyd 3

当然,您可以通过实现文档范围的键盘和/或鼠标侦听器以及具有超时的周期性方法来在 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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您的全局侦听器只需将每个操作的lastActivity 设置为当前时间。

重新阅读问题时,您希望使用应用程序服务器的实际会话超时。这是一个困难的问题,因为当你向服务器发送 ajax 请求时,你实际上会防止会话过期(除非有硬性限制),所以我的答案可能仍然是最好的方法。