2012-01-23 14 views
8

私のシステムはSpring MVCベースで、Springが自動的にPRAGMA:no-cacheを設定することを確認しました。このシステムは、SSLを介してユーザーに提供されます。ユーザーがINTERNET EXPLORER 7または8を使用して何かをダウンロードしようとすると、のようなエラーが表示されます。が表示されます(詳細はhttp://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&)。プラグマを設定しないようにSpringを設定する方法

私は、コード怒鳴るようなWebContentInterceptorを設定しようとしましたが、動作しません:

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

私は春を避けるために何ができるプラグマを送信します。no-キャッシュとキャッシュ制御に関連しますか?

よろしくお願いいたします。

+0

リンク先の記事はIE5とIE6にのみ適用されます。 – Ralph

+0

いいえ、IE 9以外のすべてのIEに適用されます。 –

答えて

7

にヘッダー値を応答オブジェクトに設定します。インターセプタはフィルタに過ぎないので、フィルタをオーバーライドし、それぞれリクエストとレスポンスヘッダを設定するには、

prehandleとposthandleを使用します。

具体的な例が必要な場合はお知らせください。

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/**" /> 
     <beans:bean id="customInterceptor" 
      class="org.example.interceptors.CustomInterceptor"> 
     </beans:bean> 
    </mvc:interceptor> 

</mvc:interceptors> 




public class CustomInterceptor implements HandlerInterceptor{ 

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView modelAndView) throws Exception { 
    response.setHeader(...);} 
} 
+1

こんにちはアビ!問題はWebContentGeneratorクラスが属性値cacheSeconds(-1の場合はヘッダーなし、それ以外の場合はヘッダーの設定)に応じてHTTPヘッダーを作成することです。そして、彼らが設定された後、彼らは応答からそれらを削除することはできません... –

+0

代わりにHandlerInterceptorを使用し、応答をポストハンドルに設定します。 – Abhi

+0

こんにちは@アビー!私はあなたが提案したことをして、私はpreHandleメソッドのソリューションを実装し、それは動作します!それはきれいではっきりした解決策ではありませんが、とにかく私の問題を解決します。 HTTPヘッダーは実行時に既に作成されているため、postHandleメソッドは解決しません。 –

2

キャッシュ秒を負の値に設定してください。


これはあなたがオーバーライドする必要があります解決しない場合:あなたは、独自のカスタムインターセプタを書くことができます

protected final void preventCaching(HttpServletResponse response) 

または

protected final void applyCacheSeconds(HttpServletResponse response, int seconds, boolean mustRevalidate) 

どちらの方法が実装されているWebContentGenerator

+0

こんにちはRalph!何が起こるのか分かりませんが、Springが起動されたとき、WebContentGeneratorのcacheSeconds属性は-1(デフォルト)に設定されていますが、applyCacheSecondsが呼び出されるとcacheSecondsは0になり、preventCachingを呼び出します。そして、setterメソッドsetCacheSecondsは一度だけ呼び出されます... –

+0

@Marcelo Juventino:この動作を説明する方法の1つは、Tomaszが(削除された)回答で示唆されたように "AnnnotatopnMethodHanlder"を "まだ"使用していますが、あなたの質問にあなたが書いたようなWebContentInterceptorがあります。 – Ralph

+0

こんにちは@ラルフ!私は両方のソリューションを試してみたが解決しなかった。 Bellow、@AbhiはHandlerInterceptorの使用を提案し、解決されたpreHandlerメソッドでソリューションを実装しました。しかし、明確で洗練された解決策ではありません。 –

1
<mvc:interceptors> 
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
     <property name="cacheSeconds" value="2100" /> 
     <property name="useExpiresHeader" value="false" /> 
     <property name="useCacheControlHeader" value="false" /> 
     <property name="useCacheControlNoStore" value="false" /> 
     <property name="cacheMappings"> 
      <props> 
       <prop key="/**/**">-1</prop><!-- removes pragma no-cache --> 
      </props> 
     </property> 
    </bean> 
</mvc:interceptors> 
2

最も単純なアプローチは、単にサーブレットフィルタが書き込まれないヘッダを停止すると考えられます。この方法でSpringの設定を変更する必要はなく、正しいキャッシュ機能を無料で取得できます。

public class PragmaFilter implements Filter { 

    private static String PRAGMA_HEADER = "Pragma"; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     chain.doFilter(request, new NoPragmaHttpServletResponseWrapper(response)); 
    } 

    @Override 
    public void destroy() { } 

    private final class NoPragmaHttpServletResponseWrapper extends HttpServletResponseWrapper { 

     private NoPragmaHttpServletResponseWrapper(ServletResponse response) { 
      super((HttpServletResponse) response); 
     } 

     @Override 
     public void addHeader(String name, String value) { 
      if (PRAGMA_HEADER.equals(name)) { 
       return; 
      } 
      super.addHeader(name, value); 
     } 

     @Override 
     public void setHeader(String name, String value) { 
      if (PRAGMA_HEADER.equals(name)) { 
       return; 
      } 
      super.setHeader(name, value); 
     } 
    } 

} 
関連する問題