若手SEを救いたい社畜の手記

わかすくしゅき

Spring MVCのレスポンスヘッダでno-store,no-cacheを付与する

この記事に書いてあること

Spring MVCを使っていて、レスポンスヘッダにno-storeやno-cacheという項目を付与したい場面があったのでメモ。

Spring Securityを使わずにServlet-Context.xmlを使う方法でいきます。

前提

  • Spring MVC 5.x
  • Java11

結論

 servlet-context.xml に設定します。
これにより、Controllerの終了後にWebContentInterceptorクラスが実行され、以下のようなresponseヘッダが設定されます。

Cache-Control: no-cache, no-store
Pragma: no-cache
Expires: 0

以下の記述を追加してください。

<interceptors>
  <bean id="webContentInterceptor"
        class="org.springframework.web.servlet.mvc.WebContentInterceptor">
    <property name="cacheSeconds" value="0"/>
    <property name="useExpiresHeader" value="true"/>
    <property name="useCacheControlHeader" value="true"/>
    <property name="useCacheControlNoStore" value="true"/>
  </bean>
</interceptors>

なお、servlet-context.xmlの書き方次第では、mvc:interceptorsとしたり、beans:beanとしないといけない場合があります。

ちょっと説明

cacheSeconds

  • -1: キャッシュ関連のヘッダーは出力しません。
  • 0: no cache 関連のヘッダーが出力されます。
  • 1以上: 100を指定した場合、'Cache-Control: max-age=100'というヘッダが出力されます。

useExpiresHeader

trueにすると、Expiresヘッダが出力されます。

Expires: Thu, 01 Jan 1970 00:00:00 GMT

useCacheControlHeader

trueにすると、以下のヘッダが出力されます。

Cache-Control: no-cache

useCacheControlNoStore

trueにすると、以下のヘッダが出力されます。

Cache-Control: no-store
  • B!