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
Constructors -
Method Summary
-
Constructor Details
-
LazySessionInvalidationFilter
public LazySessionInvalidationFilter()
-
-
Method Details
-
init
public void init(jakarta.servlet.FilterConfig filterConfig) throws jakarta.servlet.ServletException - Specified by:
initin 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:
doFilterin interfacejakarta.servlet.Filter- Throws:
IOExceptionjakarta.servlet.ServletException
-
destroy
public void destroy()- Specified by:
destroyin interfacejakarta.servlet.Filter
-