我正在使用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
答案 0 :(得分:2)
当您离开页面时,浏览器会取消正在进行的请求。因为您在窗口关闭时创建了它,所以您甚至无法确定请求是通过网络发送并到达您的服务器的。没有解决方法。
一种可能性,但也可能失败,是打开一个新窗口,以便您可以安全地在那里发出请求,然后在完成后关闭该窗口。然而,它可能会失败,因为这些窗口很可能被浏览器的弹出窗口阻止程序(内置或插件)阻止。