Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 会话过期/超时后JSP自动重定向_Java_Jsp_Session Timeout - Fatal编程技术网

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

Java 会话过期/超时后JSP自动重定向,java,jsp,session-timeout,Java,Jsp,Session Timeout,有没有办法在没有(用户交互)*的情况下检测会话超时,并将其重定向到某个页面;i、 e.如果在特定持续时间的第页上没有活动;服务器检测到它并在其他服务器上自动重定向它 我所说的用户交互是指;有一种方法可以在用户单击某个对象时检测会话超时,然后某个请求转到服务器,然后服务器检查当前用户会话是否过期 这里我需要的是,我们不通知服务器任何事情(或者我们不执行任何操作),但当会话过期时,服务器会自动检测到它并执行所需的操作 谢谢, Raza当然,通过实现一个文档范围的键盘和/或鼠标侦听器以及一个带有超时的

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

我所说的用户交互是指;有一种方法可以在用户单击某个对象时检测会话超时,然后某个请求转到服务器,然后服务器检查当前用户会话是否过期

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

谢谢,
Raza

当然,通过实现一个文档范围的键盘和/或鼠标侦听器以及一个带有超时的周期性方法,您可以在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请求时,您实际上会阻止会话过期(除非有硬限制),因此我的答案可能仍然是最好的解决方法。

我也遇到了一些相同的问题,所以下面是我如何解决它的

基本上,我用javascript在客户端创建了一个会话计时器。我定期发送一个ajax调用(在一个小于实际服务器超时设置的计时器上),以使会话在服务器上保持活动状态


然后,我在客户端创建了另一个倒计时计时器(设置为与实际服务器超时设置相同的时间)。如果计时器过期,则对运行session.invalidate()的服务器进行ajax调用,然后转发到登录页面。每当有一些操作(如鼠标单击、按键等)应保持会话活动时,此计时器就会重置。

如果要求仅重定向到登录页面(或任何其他页面) 会话超时后,我尝试执行以下操作:

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

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

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

或(避免遗漏任何页面)

实际上,您可以将其写入一个单独的文件(timedoutRedirect.jsp),并将其作为 所有需要使用“JSP属性组”(在web.xml中)登录的页面的标题


所有jsp
/使用者/*
/timedoutRedirect.jsp

(您可能需要根据您的项目规范调整prelude url)

如果没有完美的客户端逻辑,它可能是简单的servlet、spring mvc或spring security自动注销都是不可能的。
正在考虑的应用程序将具有两种类型的请求

  • AJAX和
  • 表单提交/页面重新加载
自动注销需要非常精确的逻辑。用以下内容展示我的自动功能实现

优势。
1.不使用额外的呼叫/请求来实现此目的。如果超过10k的活跃用户和额外呼叫实现自动注销,则考虑性能影响。
2.使用标签的单线配置。
3.即使用户打开多个选项卡或多个窗口,也能完美工作。
4.它会在会话失效30秒之前通知您,所以如果您已填写表单但未提交,则可以保持会话处于活动状态(通过单击扩展会话)。因此,用户不太可能丢失未保存的数据

用法
1。在所需的JSP页面中包含自动注销脚本,如下所示。

。。。。
2。创建一个JSP页面autologout-script.JSP并添加以下代码。 注意:无需编辑/配置


$(文档).ready(函数()
{
var timeOutTimeInSeconds=${timeOutTimeInSeconds};
var showTimerTimeInSeconds=${showTimerTimeInSeconds};
var sessionCheckIntervalId=setInterval(重定向到loginpage,timeouttimeunseconds*1000);
var timerDisplayIntervalId=setInterval(showTimer,(timeOutTimeInSeconds-showTimerTimeInSeconds)*1000);
巴氏锥虫;
setItem(“AjaxRequestFired”,new Date());
函数redirectToLoginPage(){
//location.href=''+'${loginPageUrl}';
window.location.reload();
}
$(文档).ajaxComplete(函数(){
重置计时器();
});
$(窗口).bind('storage',函数(e){
if(e.originalEvent.key==“AjaxRequestFired”){
log(“从另一个选项卡发送的请求,因此重置计时器”)
重置计时器();
}
});
函数resetTimer()
{
showTimerTimeInSeconds=${showTimerTimeInSeconds};
log(“timeOutTimeInSeconds:+timeOutTimeInSeconds”)
setItem(“AjaxRequestFired”,new Date());
clearInterval(sessionCheckIntervalId);
sessionCheckIntervalId=setInterval(重定向到LoginPage,timeOutTimeInSeconds*1000);
window.clearInterval(timerDisplayIntervalId);
timerDisplayIntervalId=设置间隔(showTimer,(timeOutTimeInSeconds-showTimerTimeInSeconds)*1000);
hideTimer();
}
函数showTimer()
{
$('#sessionTimeRemaining').show();
$('sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
window.clearInterval(timerDisplayIntervalId);
badgeTimerId=setInterval(函数(){
$('sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
}, 1000);
}
函数hideTimer()
{
窗口清除间隔(badgeTimerId);
$('#sessionTimeRemaining').hide();
}
});
3。将会话属性配置为配置超时设置 注意:在创建会话后配置此选项。您可以实现HttpSessionListener sessionCreated方法并设置
<jsp-property-group>
        <display-name>all jsp</display-name>
        <url-pattern>/users/*</url-pattern>
        <include-prelude>/timedoutRedirect.jsp</include-prelude>           
</jsp-property-group>
session.setMaxInactiveInterval(300);

session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);

<span class="badge badge-primary" title="click to keep session alive" id="sessionTimeRemaining" 
    onclick="ajaxSessionRefresh()" style="display:none;">
    <i class="badge badge-danger" id="sessionTimeRemainingBadge" style="float:left">30</i>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>
response.setHeader("Refresh", "60; URL=login.jsp");
<meta http-equiv="refresh" content="60; url=login.jsp">