【发布时间】:2014-02-18 11:08:14
【问题描述】:
如果会话在我的 Web 应用程序的 web.xml 文件中提到的特定时间到期, 无需单击任何链接,我的应用程序需要重定向到登录页面。我尝试使用实现 HttpSessionListener 的侦听器类,但我无法重定向到新页面,因为在普通侦听器中没有响应对象(response.sendRedirect(“login.jsp”))。
谢谢,詹帕娜
【问题讨论】:
如果会话在我的 Web 应用程序的 web.xml 文件中提到的特定时间到期, 无需单击任何链接,我的应用程序需要重定向到登录页面。我尝试使用实现 HttpSessionListener 的侦听器类,但我无法重定向到新页面,因为在普通侦听器中没有响应对象(response.sendRedirect(“login.jsp”))。
谢谢,詹帕娜
【问题讨论】:
你不能这样做。至少不像你想象的那么容易。
如果会话过期,则意味着在会话超时时间内没有来自客户端浏览器的请求。服务器甚至不知道用户是关闭了浏览器窗口还是上厕所等。
HttpSessionListener 是服务器端唯一的事件,没有客户端请求。它表示在过去 30 分钟内没有客户端对该会话的请求(如果会话超时为 30 分钟)。
因此,您无法将浏览器窗口重定向到另一个站点。
作为替代方案,您可以经常从客户端的浏览器进行轮询。但这意味着,服务器端会话只有在用户导航到另一端或关闭浏览器时才会过期。为避免这种情况,您可以实现自己的会话超时。在每个轮询请求中,您可以确定最后一个“真实”请求的时间(意味着没有轮询请求),然后重定向到登录页面并手动关闭会话。
另一种选择是使用 websockets 作为反向通道。
【讨论】:
使用Spring Security Framework,它拥有处理会话结束/重新登录情况的所有机制
或者,您可以使用 javascript 重定向到 login.jsp,例如
function redirectToLogin(){ document.location = '/login.jsp' }
setTimeout( redirectToLogin, 300 );
这可能只适用于非常简单的网络应用程序。对于 RIA,您必须通过请求服务器来检查会话状态
【讨论】:
HttpSessionListener 属于 Servlet API,而不是 Struts。无论如何,我不认为 Struts 有工具可以开箱即用地实现您的案例,因此您必须自己构建解决方案。不好的是,您无法从HttpSessionListener 向您的 Web 前端发送任何内容。浏览器必须询问服务器会话是否仍然有效。人们通常将Spring Security + AJAX 组合用于此类事情