前提・実現したいこと
セッションタイムアウト時に、ブラウザ側の操作を行なわずにタイムアウトを検知し、タイムアウトした旨をログに出力したいと考えています。
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にセッションタイムアウトがおきた際のタイムスタンプが記録されていたのでこれでタイムアウトの時間を判断できました。
回答4件
あなたの回答
tips
プレビュー