我想在会话到期时发出警报,当您在警报框中按确定按钮时,它将带您进入登录页面。为此,我想创建一个计时器和计时器任务,并在后面的类的 run 方法中检查会话是否存在。所以为此我尝试在jsp页面中创建一个类,但它显示错误。我可以在 servlet 中创建,但我所有的页面都在 jsp 中,所以这个想法没有用。现在我创建了一个 sessionlistner 并在会话销毁方法中我想链接到登录页面,但我这里也有问题。我不能使用sessiondestroyed方法中的响应方法。请告诉我还有其他方法吗
4 回答
您可以使用 JavaScript,例如:
var sessionTimeout = "<%= Session.Timeout %>";
function DisplaySessionTimeout()
{
//assigning minutes left to session timeout to Label
document.getElementById("<%= lblSessionTime.ClientID %>").innerText =
sessionTimeout;
sessionTimeout = sessionTimeout - 1;
//if session is not less than 0
if (sessionTimeout >= 0)
//call the function again after 1 minute delay
window.setTimeout("DisplaySessionTimeout()", 60000);
else
{
//show message box
alert("Your current Session is over.");
}
}
有关更多详细信息,请访问此处
首先,您可以创建完全客户端解决方案:setTimout()
在第一次加载页面时使用。使用硬编码或从服务器到达的超时值。当计时器被触发时,使用document.location = login.html
(或类似的东西)到达登录页面。
这个解决方案“又快又脏”。
更好的解决方案应该基于真正的会话到期。您可以创建不时尝试特殊 URL 的 AJAX 调用。这个 URL 应该返回true/false
这意味着会话是否过期。当会话过期时,您应该将页面重定向到登录屏幕。此解决方案的问题在于您请求会话状态会刷新它。要解决此问题,您可以向不同的服务器执行请求,或者(可能)从轮询请求中删除会话 cookie,因此它将在与主会话不同的会话中执行。
使用 Tomcat,您可以创建一个 JS 计时器来进行简单的 AJAX 调用。如果调用没有错误返回,则会话有效,如果调用失败,您可以认为会话已过期。在默认行为上,如果您没有明确调用 Tomcat,它不会更新会话。我有相反的情况:链接
Java EE Spec 已经解决了这个问题。您应该考虑使用 web.xml 配置来处理会话超时问题。它具有处理所有这些的特定标签。一些标签是:
<login-config> ... </login-config>
上面的标签允许您使用基于 FORM 的身份验证,您可以在其中指定您的登录 HTML 资源。
<security-constraint> ... </security-constraint>
上述标签可让您指定要保护的 URL。最后是会话超时标签本身,它允许您以毫秒为单位指定会话超时。
完成上述操作后,当用户请求安全 URL 时,容器会自动将用户带到登录页面。
这是web.xml参考。
从消息传递的角度来看,有多种方法可以看到问题:
系统将用户带回登录页面并强制他登录这一事实对他/她来说已经足够了。
您可以在登录页面本身上提供通用消息。
设备一些棘手的基于标志或查询字符串逻辑以在登录页面上显示消息。
在 StackOverflow 本身中遇到了这个链接,它提供了一个可以在登录页面本身中实现的策略。虽然没有尝试过。
与整个会话超时策略本身相比,这在我看来是一个微不足道的问题。