web-dev-qa-db-ja.com

注釈によってSpring MVC 3でヘッダーなしキャッシュを設定する方法

注釈によってSpring MVC 3でヘッダーなしキャッシュを設定する方法は?ではない

  response.setHeader("Pragma","No-cache");     
  response.setHeader("Cache-Control","no-cache");     
  response.setDateHeader("Expires",   0);     
39
EdwardLau

そのようなオプションはありません。インターセプターを使用できます。

<mvc:annotation-driven/>
<mvc: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>
</mvc:interceptors>

ここ から取得)

一方では、そのような注釈を持たないことが論理的です。 spring-mvcメソッドの注釈は、主にコンテナが呼び出すメソッドを決定できるようにすることです(リクエストヘッダー、リクエストURL、またはメソッドによって制限します)。応答の制御は、このカテゴリに分類されません。

一方で、はい、これらを持っていると便利です。なぜなら、コントローラーの単体テストを行うとき、httpヘッダーのものをテストすることは関係ないからです(またはそうですか?)。そして、@ResponseBodyおよび@ResponseStatus、いくつかの応答プロパティを指定します。

47
Bozho

特定のコントローラーマッピングの設定をオーバーライドするには、WebContentInterceptorのcacheMappingsプロパティオブジェクトを使用します

<bean id="webContentInterceptor"
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="2100" />
<property name="useExpiresHeader" value="true" />
<property name="useCacheControlHeader" value="true" />
<property name="useCacheControlNoStore" value="true" />
<property name="cacheMappings">
    <props>
        <prop key="/myUncachedController">0</prop>
    </props>
</property>
19
Risadinha

私はこれが古いことを知っていますが、これは一部の人に役立つかもしれません。

キャッシュするときとしないときにさらに多くのロジックを追加する場合は、カスタムインターセプターを記述することもできます。

たとえば、ブラウザがIEまたは特定のURLからのみである場合にのみ、応答でキャッシュを無効にしたい場合は、- HandlerInterceptorインターフェイス。

そうすることで、何が起こるかを正確に制御できます。一度にすべてのヘッダーを設定するか、各コントローラーの応答の変更を入力するだけでは簡単ではありませんが、それほど難しくはなく、私の意見ではより良い長期的なソリューションです。また、一般的に春に行う方法を知ることは良いことです。

これは非常に良いチュートリアルです:

http://www.mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/

1
njfife