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);
    }

github.com

リファレンスには下記のようにあるので、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 がよく分からなかったので実験してみる

Duration 実験

まとめ

つまり、application.yml の 1 秒とか 2 秒の設定は、Duration#toMinutes()0 になって Math.max(sessionTimeout.toMinutes(), 1) の比較で 1 に負けて、1 分つまり 60 が設定されたってことか。

秒で設定出来そうに見えて、分刻みでしか設定出来ないってことになるんだな。

最小の設定は 1 分 (= 60 秒)なんだな。