質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

解決済

セッションタイムアウト時にクライアントからの操作を行なわずにそれを検知したい

koronatail
koronatail

総合スコア433

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

4回答

0グッド

0クリップ

10002閲覧

投稿2018/06/04 01:38

編集2018/06/04 04:44

前提・実現したいこと

セッションタイムアウト時に、ブラウザ側の操作を行なわずにタイムアウトを検知し、タイムアウトした旨をログに出力したいと考えています。
1つ考えた方法としてはセッションタイムアウトが想定される時間をjavascriptで計って、タイムアウトしてそうであればサーバーにリクエストを送って判断させる方法なのですが、これでは確実にタイムアウトを検知できる保障が無いと考えました。

検索してみたのですが、そういったことが可能なのかどうか判断できませんでした。
こういったことは可能なのでしょうか。何かツールやソフトを利用すればできるといった情報、また関連するキーワード等なにかご存知であれば教えていただければと思います。

###追記
可能であればブラウザを閉じていたとしてもそれを判断させたいです。
ログインを行なうシステムを想定しているため、ブラウザを閉じても次回ログイン時に前回のセッションIDを利用して判断は可能かと考えましたが、これでは次にログインしてくれない限りログが残らなくなってしまいます。
何か他の方法があればご教示願います。

###解決方法
LogoutListener.javaを作成

java

1package co.jp.health.common.config; 2 3import java.util.List; 4 5import org.springframework.context.ApplicationListener; 6import org.springframework.security.core.context.SecurityContext; 7import org.springframework.security.core.session.SessionDestroyedEvent; 8import org.springframework.security.core.userdetails.UserDetails; 9import org.springframework.stereotype.Component; 10 11@Component 12public class LogoutListener implements ApplicationListener<SessionDestroyedEvent> { 13 14 @Override 15 public void onApplicationEvent(SessionDestroyedEvent event) 16 { 17 System.out.println("onApplicationEvent が呼ばれました" + event.toString()); 18 List<SecurityContext> lstSecurityContext = event.getSecurityContexts(); 19 UserDetails ud; 20 for (SecurityContext securityContext : lstSecurityContext) 21 { 22 ud = (UserDetails) securityContext.getAuthentication().getPrincipal(); 23 // ... 24 } 25 } 26 27} 28

WebSecurityConfigurerAdapterを継承したクラスに以下の記述を追加

java

1 @Bean 2 public DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher() { 3 return new DefaultAuthenticationEventPublisher(); 4 }

この記述をすることで、セッションタイムアウト時にLogoutListenerクラスのonApplicationEventが呼ばれました。
セッションタイムアウトが起きたタイミングで正確に呼ばれるわけではありませんが、引数のeventにセッションタイムアウトがおきた際のタイムスタンプが記録されていたのでこれでタイムアウトの時間を判断できました。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

maisumakun

2018/06/04 02:00

セッションタイムアウトと言っても、「ブラウザは開いているけど」タイムアウトした場合と、「ブラウザを閉じてしまって」そのままタイムアウトと言う場合などいくつか考えられますが、後者の方の対応は不要ということで間違いないでしょうか。
koronatail

2018/06/04 02:10

>maisumakun様 追記させていただきました。可能であればブラウザを閉じてしまった場合でもタイムアウトを判断したいです。

回答4

3

ベストアンサー

Springに詳しくないこともあって、どれくらい今回の用途に役に立つかも判断しきれないのですが、セッション切断時にSessionDestroyedEventが起きるので、それを拾う、というような方法があるようです(StackOverflow)。

投稿2018/06/04 02:15

maisumakun

総合スコア141314

koronatail, m.ts10806, asahina1979👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

koronatail

2018/06/04 04:49 編集

>maisumakun様 回答ありがとうございます。まさに求めていた機能でした!私の調べたりなかったようです・・・ありがとうございました。質問文にもSessionDestroyedEventを利用した解決方法を追記させていただきました。

2

maisumakunさんの回答と同じですが、サーブレットの sessionDestroyedイベントを拾ってログに記録する方法が考えられます。
ちょっと検索したらTomcat環境でのWeb.xmlの記述方法と、イベントハンドラーのコードサンプルがありました。

Hooking Up HTTPSessionListener with Tomcat

ご参考になれば。

投稿2018/06/04 02:46

tkanda

総合スコア2425

koronatail, m.ts10806👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

koronatail

2018/06/04 04:49

>tkandaさん 回答ありがとうございます。回答が早かったためBAはmaisumakun様にさせていただきましたがこちらも参考になりました。ありがとうございました。

1

HttpSessionListener

だとログだせなかったということ?

投稿2018/06/04 02:14

asahina1979

総合スコア8154

m.ts10806👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

koronatail

2018/06/04 04:49 編集

>asahina1979様 回答ありがとうございます。私が試した限りだと、HttpSessionListenerはクライアントから操作を行なわないと呼ばれず、完全に無操作な状態だといつまでたっても呼ばれない形になってしまいました。定期的にリクエストを送る方法以外に何かあればと思い質問させていただきました。

0

いずれにしてもサーバー側に何らかの方法でアクセスしなければなりません。
例えばJavaScriptでsetTimeout()で繰り返しAjaxにてサーバーにアクセスし、セッション有効の有無を確認するやり方はいかがでしょうか。
無であればログ出力、有であれば継続。

ただ、実際は用途によります。
セッションが切れていればいずれにしてもセッション有効時の処理は行わせないのが原則なので、
画面無操作時間が長時間に渡る時場合で何かしようとした際は、リクエストの初っ端でセッション有無を確認してしまえはひとまず回避は可能かと(セキュリティ的にどこまで万全かは置いといて)

投稿2018/06/04 01:47

m.ts10806

総合スコア79935

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

koronatail

2018/06/04 02:13

回答ありがとうございます。やはり定期的にjavascriptでチェックする形が現実的でしょうか。可能であればブラウザを閉じていてもそれを検知したいのですが現実的ではなさそうですね・・・。
m.ts10806

2018/06/04 02:50

SpringやJavaの機能を度外視しての回答なのであくまで一例として捉えていただければと。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。