Package nablarch.fw.web.httpserver
Class LazySessionInvalidationFilter
java.lang.Object
nablarch.fw.web.httpserver.LazySessionInvalidationFilter
- All Implemented Interfaces:
jakarta.servlet.Filter
HttpSession.invalidate()
の呼び出しを遅延させるFilter
実装クラス。
HttpRequestTestSupportHandler
では、
テストクラスとJetty上で実行されるテスト対象間でのExecutionContext
のコピーを行っている。
テスト実行中にセッションがinvalidateされた場合、Jetty 12ではExecutionContext
の
書き戻し時にIllegalStateException
がスローされてしまう。
これを回避するためには、HttpSession.invalidate()
が実行されるタイミングを遅らせる必要がある。
サーブレットフィルタ(本クラス)を差し込んで、ここでHttpServletRequest
をラップする。
ラップしたHttpServletRequest
は、セッションを要求されると、やはりラップしたHttpSession
を返却する。
このラップしたHttpSession
ではHttpSession.invalidate()
が呼び出されても、実際にはinvalidateをせず、
invalidateが要求されたことを記録しておく。
後続のすべての処理が終わった後、invalidateが要求された場合、実際にinvalidateを実行する。
Jetty 9 ではラップに標準APIの Proxy を用いていたが、 Jetty 12 では単純なラップクラスを使用している。
これは、 Jetty 12 が内部で instanceof
を使ってServletRequestWrapper
かどうか
判定している部分があり、 Proxy を用いているとその判定条件に入れないという理由があるためである。-
Constructor Summary
-
Method Summary
-
Constructor Details
-
LazySessionInvalidationFilter
public LazySessionInvalidationFilter()
-
-
Method Details
-
init
public void init(jakarta.servlet.FilterConfig filterConfig) throws jakarta.servlet.ServletException - Specified by:
init
in interfacejakarta.servlet.Filter
- Throws:
jakarta.servlet.ServletException
-
doFilter
public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response, jakarta.servlet.FilterChain chain) throws IOException, jakarta.servlet.ServletException HttpSession
のラップを行う。 後続処理終了後に遅延してHttpSession.invalidate()
を行う。- Specified by:
doFilter
in interfacejakarta.servlet.Filter
- Throws:
IOException
jakarta.servlet.ServletException
-
destroy
public void destroy()- Specified by:
destroy
in interfacejakarta.servlet.Filter
-