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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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プロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

4回答

13710閲覧

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

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プロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿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にセッションタイムアウトがおきた際のタイムスタンプが記録されていたのでこれでタイムアウトの時間を判断できました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/06/04 02:00

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

2018/06/04 02:10

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

回答4

0

ベストアンサー

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

投稿2018/06/04 02:15

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koronatail

2018/06/04 04:49 編集

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

0

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

Hooking Up HTTPSessionListener with Tomcat

ご参考になれば。

投稿2018/06/04 02:46

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koronatail

2018/06/04 04:49

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

0

HttpSessionListener

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

投稿2018/06/04 02:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koronatail

2018/06/04 04:49 編集

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

0

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

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

投稿2018/06/04 01:47

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koronatail

2018/06/04 02:13

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

2018/06/04 02:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問