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

时间:2010-09-17 07:01:45

标签: jquery ajax session session-timeout tapestry

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

3 个答案:

答案 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>";
    }

?>

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