2017-01-13 11 views
3

私たちは、とりわけ、spring mvcとspring securityを使用するWebアプリケーションを持っています。私は、言ったように豆HttpSessionDestroyedEventが送信された理由とその理由

@Bean 
public SessionDestroydEventListener sessionDestroydEventListener() { 
    return new SessionDestroydEventListener(); 
} 

として定義

public class SessionDestroyedEventListener implements ApplicationListener<HttpSessionDestroyedEvent> { 

    @Override 
    public void onApplicationEvent(HttpSessionDestroyedEvent event) { 
     for (SecurityContext securityContext : event.getSecurityContexts()) { 
      AuthenticationDetails authenticationDetails = getAuthenticationDetails(securityContext.getAuthentication()); 

      // clean out data X 
     } 
    } 
} 

:セッションがタイムアウトには、我々はデータX

を一掃したいときに我々はこのようになりますリスナを登録しますこのリスナーの主な用途は、セッションが長すぎるために非アクティブになったときにデータXを削除することです。しかし、このリスナーは、データXが削除され、ユーザーセッションが中断する原因となるため、タイムアウトの前に時々呼び出されることがあります。これらのイベントは予期せず発生し、ユーザーエクスペリエンスが低下します(当社のWebサイトで積極的に作業している間にユーザーがログアウトする)。

私は、SessionDestroyedEventListener.onApplicationEventが呼び出されない理由を調べたいと思っています。私はこれや他の人が同様の問題を抱えていることについて有益な情報を見つけるのに苦労しています。

この問題が発生した場合、私たちのログは沈黙しています。スタックトレースはありません。通常、SessionDestroyedEventListenerが青から呼び出されたときにすべてが完璧に動作しているようです。

セットアップ全体が複雑で、このstackoverflowレポートの中核となる問題を実際に解決するのは難しいかもしれませんが、私は主にトラブルシューティングのヒントに興味があります。イベント(タイムアウト、ブラウザからの不正なjsessionidなど)や何らかの設定を行って、何が起きているのかについてより多くの情報を得ることができます。

私たちには、Webアプリケーションを実行している2つ以上のwildflyサーバーに負荷分散するApacheフロントエンドがありますが、スティッキセッションを使用すると、ブラウザセッションはjsessionidを使用してwildflyサーバーにロックされます。

編集:明らかにするために、主な問題は、なぜセッションが破壊されたのかをチェックしたいのではなく、セッションがタイムアウトする前にすべて破棄されてしまうことです。それがセッションがどのように破壊されたかを私たちに知らせるので、その理由を知ることは素晴らしいことです。問題の原因を見つけることができます。

+0

ユーザーがサイト上でまだアクティブであっても、サーバーとの通信が行われず、タイムアウトが発生する可能性がありますか?私はこれが起こっているのを見て、セッションを生き続けるためにハートビート信号を実装することで解決しました。 – kaqqao

+0

@kaqqao:私たちのサイトは、サイトからページを頻繁に再読み込みし、ユーザーがサーバーにクエリを送信せずにページに留まるかもしれない場所では、あなたのようなハートビートシグナルを持っています。ブラウザーからwildflyサーバーにクエリーが送信された後(2〜30秒)、私たちのランダムログアウトがまれに発生することは珍しくありません(ログタイムスタンプで見ることができます)。 –

答えて

0

イベントのソース名のロギングはどうですか?そこにあればevent.getSource().getClass().getName();

よう

何かが真の非アクティブなイベントからソースとあなたが望んでいない他のイベントとの違いを参照してください。次に、ソースが異なる場合は、あなたの問題を解決する場合は井戸が配置されます。

+0

ありがとう!私はソースフィールドがあったのを見逃しているようですが、試してみることがあります - 私たちは時々だけエラーを見て、エラーが表示された場所にコントローラを配備しています。 –

+0

私はロギングを追加し、期待通りに動作するシンプルなタイムアウトを行いました。これはsource = io.undertow.servlet.spec.HttpSessionImplを与えました。私もこのログオンでエラーを強制しようとしますが、私はHttpSessionImplもそう言える良いチャンスがあると思います... –

関連する問題