GWT RequestFactory:在ClosingHandler中发送请求

GWT RequestFactory:在ClosingHandler中发送请求,gwt,requestfactory,audit,Gwt,Requestfactory,Audit,我正在使用RequestFactory框架为基于GWT的应用程序开发审计服务。我在使用ClosingHandler审核用户注销时遇到一些问题。这是我的密码: 我的审计服务总结: private static final int MAX_CACHE_SIZE=15; 私有int cacheSize=0; 私有AuditServiceRequestContext; @凌驾 公共作废审核(字符串事件、字符串详细信息){ if(上下文==null) context=createContext(); Au

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

我的审计服务总结:

private static final int MAX_CACHE_SIZE=15;
私有int cacheSize=0;
私有AuditServiceRequestContext;
@凌驾
公共作废审核(字符串事件、字符串详细信息){
if(上下文==null)
context=createContext();
AuditServiceRequestContext cxt=createContext();
context.append(cxt);
AuditProxy=cxt.create(AuditProxy.class);
/*使用事件和详细信息初始化代理*/
cxt.persist(代理);
如果(++cacheSize>=最大缓存大小)
冲洗();
}
公共图书馆{
context.fire();
cacheSize=0;
上下文=空;
}
我当前如何处理注销事件:

Window.addWindowClosingHandler(新的ClosingHandler(){
@凌驾
窗口关闭时公共无效(ClosingEvent事件){
audit.audit(“注销”,“用户已关闭应用”);
audit.flush();
}
});
数据被持久化,但请求失败,因为
/gwtRequest
上的HTTP请求没有返回任何响应(chrome的开发者工具上的状态已取消)。
有什么办法解决这个问题吗

编辑:


奇怪的是,将
CloseHandler
窗口#addCloseHandler(CloseHandler)
一起使用并没有错误。我不明白为什么,但它很有效(如果有人能向我解释,我真的很喜欢):当你离开页面时,浏览器会取消正在进行的请求。因为您在窗口关闭时发出了请求,所以您甚至无法确定请求是否通过网络发送并到达了服务器。没有解决办法


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

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


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

非常感谢您的回复:)我已经理解了为什么它不起作用,我希望有人能提供解决方法:'(我想我不会审核注销事件,也不会“缓存”上下文……再次感谢;)忘了说:如果您有一个服务器端会话,“审计”会话过期和会话破坏(从用户处显式“注销”),最好是作为不同的事件,因为过期可能只是意味着页面在一个baclground选项卡/窗口中保持打开很长时间。这是个好主意!我将这样看,再次感谢:)非常感谢您的回复:)我已经理解了为什么它不起作用,我希望有人能找到解决办法:'(我想我不会审核注销事件,也不会“缓存”上下文…再次感谢;)忘了说:如果您有服务器端会话,“审核”会话过期和会话破坏(从用户处显式“注销”),最好作为不同的事件,因为过期可能只是意味着页面在baclground选项卡/窗口中保持打开很长时间。这是个好主意!我将以这种方式查看,再次感谢:)