7

我正在使用 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基本上使用似乎是一个好方法。

4

3 回答 3

5

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

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

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

于 2010-09-17T07:25:16.573 回答
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 请求,页面都会重新加载并重定向到您的索引页面

于 2010-10-08T10:12:35.267 回答
0

好吧,向服务器发出 Ajax 请求,它发送带有值“XMLHttpRequest”的标头“HTTP_X_REQUESTED_WITH”。您可以检查服务器端是否是带有上述标头的 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>";
    }

?>

您可以在框架中添加与它类似的条件。

于 2010-09-17T07:31:10.867 回答