0

我有一个为 CloseEvent 注册 CloseHandler 的 GWT 应用程序。此处理程序调用另一个类中的 logout() 方法,该方法进行一些清理并调用 RPC 方法将用户从底层服务器应用程序中注销(GWT 应用程序是一个客户端,Web 服务器是中间层)。

这是 CloseHandler 的代码:

Window.addCloseHandler( 
    new CloseHandler<Window>() {
    @Override
    public void onClose( CloseEvent<Window> event ) {
            MainPresenter main = Client.this.context.getMainPresenter();

            if (main != null) {
 System.out.println("calling main.logout()..." );
                main.logout();
 System.out.println("back from logout()..." );
            }
        }
    });

下面是 logout() 方法的代码:

public void logout() {
System.out.println("in logout()..." );
    /*
     * This callback method likely will not be executed because this
     * logout method is going to be called as the browser window is
     * closing.  Consequently, the RPC call will not return.  But if it
     * does, simply ignore the return.
     */
    AsyncCallback<UserOperationResult> callback = new AsyncCallback<UserOperationResult>() {

        @Override
        public void onFailure( Throwable caught ) {
            // ignore
            System.out.println("logout failed:" + caught);
            caught.printStackTrace();
        }

        @Override
        public void onSuccess( UserOperationResult result ) {
            // ignore
            System.out.println("result=" + result);
        }
    };

System.out.println("calling authentication service-> logout()..." );
    this.context.getAuthenticationService().logout( MainLimsPresenter.this.context.getUser(), callback );
    // stop the ping service
    this.context.stopPingTimer();
System.out.println( "stopped ping timer..." );
    this.context.stopBlockedTimer();
System.out.println("stopped blocked timer..." );

    releaseRegistrations();
System.out.println("released registrations..." );

}

生成的输出如下所示:

mozilla/5.0 (windows nt 6.1; wow64; rv:18.0) gecko/20100101 firefox/18.0
closing... end session
calling main.logout()...
in logout()...
calling authentication service-> logout()...
stopped ping timer...
stopped blocked timer...
released registrations...
back from logout()...

如您所见,RPC 方法在应用程序完成之前就被调用了,但是没有来自 Web 服务服务的日志记录/调试消息,并且用户没有从底层应用程序中注销。所以 RPC 真的从来没有被调用过。

在最近升级到 Firefox 21 之前,这一直很好。测试表明这适用于 Firefox 9、15、16 和 17,但在 18.0.2 版本中停止工作。它适用于 Chrome (27) 和 IE9 以及以前版本的 Chrome 和 IE。

我尝试查看 Firefox 18 的更改列表,看看是否有一些我可以确定的可能会影响 RPC 方法的调用,但找不到任何明显的东西。

有没有其他人遇到过这个问题或有解决方法?

谢谢!

4

1 回答 1

0

你应该为 Firefox 使用这个 closeHandler

 Window.addCloseHandler(new CloseHandler<Window>() {

        @Override
        public void onClose(CloseEvent<Window> event) {

对于其他浏览器这个

     Window.addWindowClosingHandler(new Window.ClosingHandler() {

        @Override
        public void onWindowClosing(ClosingEvent event) {
于 2013-08-10T19:32:44.423 回答