我正在使用Tapestry和Spring Security以及除Prototype之外的jQuery库构建一个webapp。当用户在会话超时后单击链接时,会自动将其重定向到登录页面。当然,这对于触发AJAX请求的链接不起作用。
我知道,这是任何类型的网络应用程序的常见问题(例如http://www.openjs.com/articles/ajax/session_timeout.php)。 Tapestry 5是否有最佳实践解决方案?
修改 以下解决方案(感谢Henning)对我有用:
Ajax.Responders.register( { onException: function() { window.location.reload(); } });
如果在AJAX调用期间发生故障,则会触发页面重新加载,从而重定向到登录页面。它仍然需要一些调整(例如显示错误消息而不是重定向),但使用Ajax.Responders
基本上似乎是一种很好的方法。
答案 0 :(得分:5)
对于使用Prototype的AJAX,您可以使用AJAX.Responders添加一个响应AJAX失败的全局侦听器; jQuery有一个类似的结构叫做Ajax Events,你可以使用它。
两个事件处理程序都应该在403错误时重定向到登录页面。您可以使用此功能创建mixin并将其添加到布局组件中。
我还使用了一种机制,可以在应用程序仍然在浏览器窗口中打开时通过执行AJAX调用并每隔几分钟接收一个空响应来防止会话超时,从而保持会话打开。愚蠢,但工作正常。
答案 1 :(得分:3)
您可以提供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请求,页面将重新加载并重定向到您的索引页
答案 2 :(得分:0)
好吧,Ajax请求发送到服务器,它发送标题为“HTTP_X_REQUESTED_WITH”的值为“XMLHttpRequest”。您可以检查服务器端是否是具有上述标头的ajax请求以及登录和会话超时的条件,然后再在索引页面中继续操作。
如果你的标准匹配,那么只需在你的函数中打印“window.top.location.href ='登录页面'”。
在PHP中我可以这样做,
<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check){
echo "<script>window.top.location.href='login.php'</script>";
}
?>
您可以在框架中添加与其类似的条件。