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 错误的主要内容,如果未能解决你的问题,请参考以下文章
如果会话超时,如何在 MVC 中的 jquery ajax 调用后重定向到新页面?
Spring Web 应用程序中带有 Ajax 轮询的会话超时