GWT RequestFactory:在ClosingHandler中发送请求

时间:2013-07-12 07:20:29

标签: gwt requestfactory audit

我正在使用RequestFactory框架为基于GWT的应用程序开发审计服务。我使用ClosingHandler审核用户注销时遇到了一些麻烦。这是我的代码:

我的审计服务的总结:

private static final int MAX_CACHE_SIZE = 15;
private int cacheSize = 0;
private AuditServiceRequestContext context;

@Override
public void audit(String event, String details) {
    if (context == null)
        context = createContext();
    AuditServiceRequestContext cxt = createContext();
    context.append(cxt);

    AuditProxy proxy = cxt.create(AuditProxy.class);
    /* intialize the proxy with event and details */
    cxt.persist(proxy);

    if (++cacheSize >= MAX_CACHE_SIZE)
        flush();
}

public void flush() {
    context.fire();
    cacheSize = 0;
    context = null;
}

我目前如何处理退出事件:

Window.addWindowClosingHandler(new ClosingHandler() {
                        @Override
                        public void onWindowClosing(ClosingEvent event) {
                            audit.audit("logout", "the user has closed the app");
                            audit.flush();
                        }
                        });

数据是持久的,但请求失败,因为/gwtRequest上的HTTP请求未返回任何响应(在chrome的开发人员工具上取消了状态)。
有什么想法解决这个问题吗?

修改

奇怪的是,CloseHandler使用Window#addCloseHandler(CloseHandler)时没有错误。不明白为什么,但它有效(如果有人可以向我解释,我真的很喜欢):D

1 个答案:

答案 0 :(得分:2)

当您离开页面时,浏览器会取消正在进行的请求。因为您在窗口关闭时创建了它,所以您甚至无法确定请求是通过网络发送并到达您的服务器的。没有解决方法。

一种可能性,但也可能失败,是打开一个新窗口,以便您可以安全地在那里发出请求,然后在完成后关闭该窗口。然而,它可能会失败,因为这些窗口很可能被浏览器的弹出窗口阻止程序(内置或插件)阻止。