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 メソッドの呼び出しに影響を与える可能性があると判断できる何かがあるかどうかを調べてみましたが、明確なものを見つけることができませんでした。
他の誰かがこの問題に遭遇したか、回避策を持っていますか?
ありがとう!