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 に答える