Spring Boot でセッションタイムアウトを1秒に設定しようとしてハマった
バージョンとか
- Spring Boot 2.0.2
- Embedded Tomcat
設定してみる
application.yml にタイムアウトの設定を追加して、下記のコードで確認を行う。
タイムアウトの値は極端に短く 1 秒になるようにしてみる。
server: servlet: session: timeout: 1
int t = request.getSession().getMaxInactiveInterval();
System.out.println(t);
結果は
60
getMaxInactiveInterval()
の戻り値は秒だから 60 秒ってことか。
timeout: 2
に変更しても、結果は変わらず。
何で 1 秒ならんの?
ちなみに、yml から設定を削除して実行してみると、1800 が表示されるので、 デフォルトは 1800 秒( = 30 分) のようだ。
60 になってるから設定は何かしら効いているっぽい。
よくわからんからソース読む。
で、このあたりが怪しい。Math.max で大きい方取ってる。
private long getSessionTimeoutInMinutes() { Duration sessionTimeout = getSession().getTimeout(); if (isZeroOrLess(sessionTimeout)) { return 0; } return Math.max(sessionTimeout.toMinutes(), 1); }
リファレンスには下記のようにあるので、application.yml の設定は「秒」で設定されてる。
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used.
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Duration がよく分からなかったので実験してみる
まとめ
つまり、application.yml の 1 秒とか 2 秒の設定は、Duration#toMinutes()
で 0
になって Math.max(sessionTimeout.toMinutes(), 1)
の比較で 1 に負けて、1 分つまり 60 が設定されたってことか。
秒で設定出来そうに見えて、分刻みでしか設定出来ないってことになるんだな。
最小の設定は 1 分 (= 60 秒)なんだな。