【问题标题】:can I redirect the page without any request to server in java?我可以在没有任何请求的情况下将页面重定向到 Java 中的服务器吗?
【发布时间】:2014-02-18 11:08:14
【问题描述】:

如果会话在我的 Web 应用程序的 web.xml 文件中提到的特定时间到期, 无需单击任何链接,我的应用程序需要重定向到登录页面。我尝试使用实现 HttpSessionListener 的侦听器类,但我无法重定向到新页面,因为在普通侦听器中没有响应对象(response.sendRedirect(“login.jsp”))。

谢谢,詹帕娜

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    你不能这样做。至少不像你想象的那么容易。

    如果会话过期,则意味着在会话超时时间内没有来自客户端浏览器的请求。服务器甚至不知道用户是关闭了浏览器窗口还是上厕所等。

    HttpSessionListener 是服务器端唯一的事件,没有客户端请求。它表示在过去 30 分钟内没有客户端对该会话的请求(如果会话超时为 30 分钟)。

    因此,您无法将浏览器窗口重定向到另一个站点。

    作为替代方案,您可以经常从客户端的浏览器进行轮询。但这意味着,服务器端会话只有在用户导航到另一端或关闭浏览器时才会过期。为避免这种情况,您可以实现自己的会话超时。在每个轮询请求中,您可以确定最后一个“真实”请求的时间(意味着没有轮询请求),然后重定向到登录页面并手动关闭会话。

    另一种选择是使用 websockets 作为反向通道。

    【讨论】:

      【解决方案2】:

      使用Spring Security Framework,它拥有处理会话结束/重新登录情况的所有机制

      或者,您可以使用 javascript 重定向到 login.jsp,例如

      function redirectToLogin(){ document.location = '/login.jsp' }
      
      setTimeout( redirectToLogin, 300 );
      

      这可能只适用于非常简单的网络应用程序。对于 RIA,您必须通过请求服务器来检查会话状态

      【讨论】:

      • 感谢您的回复,我需要在web.xml文件中设置会话到期时间,而不是任何jsp文件,并且我正在使用struts框架,您能告诉我如何使用Listener for这个目的。
      • 第一关 HttpSessionListener 属于 Servlet API,而不是 Struts。无论如何,我不认为 Struts 有工具可以开箱即用地实现您的案例,因此您必须自己构建解决方案。不好的是,您无法从HttpSessionListener 向您的 Web 前端发送任何内容。浏览器必须询问服务器会话是否仍然有效。人们通常将Spring Security + AJAX 组合用于此类事情
      • 我们可以在struts应用程序中使用servlet,在struts中主控制器是ActionServlet,它本身就是一个Servlet。我的想法是当会话过期时,我会从我的监听器类中收到通知,比如会话已过期,这是在部署描述符中配置的,在那一刻我想将页面重定向到登录页面
      猜你喜欢
      • 2020-09-02
      • 1970-01-01
      • 2014-08-11
      • 2021-07-30
      • 1970-01-01
      • 2013-09-06
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多