Tapestry 应用程序中的会话超时 AJAX 错误

Posted

技术标签:

【中文标题】Tapestry 应用程序中的会话超时 AJAX 错误【英文标题】:Session Timeout AJAX Error in Tapestry Application 【发布时间】:2011-04-13 14:15:21 【问题描述】:

我正在使用 Tapestry 结合 Spring Security 和除 Prototype 之外的 jQuery 库来构建一个 web 应用程序。当用户在会话超时后单击链接时,他会自动重定向到登录页面。当然,这不适用于触发 AJAX 请求的链接。

我知道,这是任何类型的 Web 应用程序的常见问题(例如 http://www.openjs.com/articles/ajax/session_timeout.php)。 Tapestry 5 是否有最佳实践解决方案?

编辑 以下解决方案(感谢 Henning)对我有用:

Ajax.Responders.register(

    异常:函数()
    
        window.location.reload();
    
);

如果在 AJAX 调用期间发生故障,则会触发页面重新加载,结果重定向到登录页面。它仍然需要一些调整(例如显示错误消息而不是重定向),但使用Ajax.Responders 基本上似乎是一个好方法。

【问题讨论】:

按照作者在文章中的建议去做。从javascript遇到它。 只重新加载页面是一个非常优雅的解决方案;我将把它设为我的应用程序的新默认值。谢谢! 【参考方案1】:

对于使用 Prototype 的 AJAX,您可以添加一个全局侦听器,该侦听器使用 AJAX.Responders 对 AJAX 故障作出反应; jQuery 有一个类似的构造,称为 Ajax Events,您可以使用它。

两个事件处理程序都应该在出现 403 错误时重定向到登录页面。您可以使用此功能创建一个 mixin 并将其添加到您的布局组件中。

我还使用了一种机制来防止会话超时,而应用程序仍在浏览器窗口中打开,只需执行 AJAX 调用并每隔几分钟接收一个空响应,从而保持会话打开。愚蠢,但工作正常。

【讨论】:

【参考方案2】:

你可以贡献 T5 主调度器

public class AjaxAccessController implements Dispatcher @Override public boolean dispatch(Request request, Response response) throws IOException // Si no hay session y la petición es ajax, recargar la página Session session = request.getSession(false); if (session == null && request.isXHR()) OutputStream os = response.getOutputStream("application/json;charset=UTF-8"); os.write("\"script\":\"window.location.reload();\"".getBytes()); os.flush(); return true; return false;

在您的 AppModule.java 中

public static void bind(ServiceBinder binder) // binder.bind(MyServiceInterface.class, MyServiceImpl.class); // Make bind() calls on the binder object to define most IoC services. // Use service builder methods (example below) when the implementation // is provided inline, or requires more initialization than simply // invoking the constructor. // Id de AjaxAccessController binder.bind(AjaxAccessController.class).withId("AjaxAccessController"); public void contributeMasterDispatcher( OrderedConfiguration configuration, @InjectService("AjaxAccessController") Dispatcher accessController) configuration.add("AjaxAccessController", accessController, "before:ComponentEvent");

所以每个没有会话的 ajax 请求,页面都会重新加载并重定向到您的索引页面

【讨论】:

这在 Tapestry 5.3.7 上对我不起作用。相反,我使用 ComponentRequestFilter 来做你在 Dispatcher 中所做的事情。【参考方案3】:

好吧,Ajax 请求发送到服务器,它发送标头“HTTP_X_REQUESTED_WITH”,值为“XMLHttpRequest”。您只需检查服务器端是否是带有上述标头的 ajax 请求以及登录和会话超时条件,然后再继续在您的索引页面中进行。

如果您的条件得到匹配,那么只需在您的函数中打印“window.top.location.href='login page'”。

在 PHP 中我可以这样做,

<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check)
    echo "<script>window.top.location.href='login.php'</script>";
    

?>

你可以在你的框架中添加类似的条件。

【讨论】:

以上是关于Tapestry 应用程序中的会话超时 AJAX 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 AJAX 请求中的会话超时

JSP+Struts:处理 AJAX 调用中的会话超时

如果会话超时,如何在 MVC 中的 jquery ajax 调用后重定向到新页面?

Spring Web 应用程序中带有 Ajax 轮询的会话超时

使用 AJAX 自动刷新在 Web 应用程序上超时会话的方法

Spring 安全性 + Ajax 会话超时问题