0

Java チャット アプレットのユーザーが、ブラウザ ウィンドウを閉じるときに自動的にログアウトされるようにしたいと考えています。

現在、次のものを使用しています。

public void destroy() {
    sendLogoutMessage();
}

ただし、これは 3/4 の時間しか機能しません (おそらくネットワークの遅延が原因です)。

チャット アプレットはサーバーに ping を送信し、90 秒後にログアウトします (これにより、インターネットの問題が原因で再接続できるようになります)。最終的には削除されますが、閉じるイベントをより適切にキャッチする方法が必要です。

4

1 に答える 1

0

あなたのコードは、待機せずに開かれているネットワーク接続を含むすべてを閉じる destroy メソッドで呼び出されるため、100% の場合には機能しないと思います。そのため、ネットワークが遅い場合、ログアウト メッセージをサーバーに送信する前に、アプレットとその出力ストリームが強制終了されることがあります。

私の理論が正しければ、おそらくそれを確認できます。

  • サーバーログでログアウトコマンドを取得するかどうかを確認してください (失敗した場合)。コマンドが届いていないことがわかると思います。
  • クライアント側で Java コンソールを開きます。おそらく、IOException または SocketException が発生します。例外を調べることで、解決策を改善する方法がわかると思います。

さらに、次のことをお勧めします。

  1. サーバー側にサーブレット セッション リスナーを追加し、セッションの有効期限が切れると自動的にログアウトします。
  2. HTTP セッションの存続可能時間を妥当な数に減らします。JBoss のデフォルト値は 20 分なので、1 分にします。
  3. アプレットからキープアライブ メカニズムを実装します。とてもシンプルかもしれません。何もしない特別な URL に対して 30 秒ごとに HTTP GET を実行するだけです。これにより、セッションが存続します。

このソリューションは、3/4 の確率で機能する既存のソリューションに追加する必要があります。

これが役立つことを願っています。幸運を。

于 2010-12-20T12:46:00.547 に答える