0

昨日、私はこの質問をし、いくつかの非常に良いフィードバックを得ました. 私の状況を要約すると、キャッシュを禁止する HTTP 応答ヘッダーを Spring MVC Web アプリ (予期せず継承したプロジェクト) に追加しようとしています。

したがって、回答者(そして最終的には@Bozho)の提案に従って、これをSpring構成ファイルに追加しました:

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

アプリをローカルで再構築し、Firefox で開いたので、Firebug を使用して、HTTP 応答で返されるヘッダーをテストできました。

残念なことに、当初の開発者は、実際の JSP ページごとに約 40 回以上の AJAX 呼び出しを行う「1 ページの Web アプリ」にすることを目指していました。

これらの 40 以上の AJAX リクエストのいずれにも、探しているヘッダーが表示されないだけでなく、JSP ページごとに複数の AJAX リクエストがあるため、Spring インターセプターが認識しないことが懸念されます。ヘッダーを追加するために AJAX が呼び出すもの。Spring が私の構成を気に入らないことを示すエラー メッセージやログ出力は表示されません。Cache-ControlExpires

  • これを間違って構成したのでしょうか。そうでない場合、これが機能しない理由は何ですか (インターセプターが起動しないのはなぜですか)?
  • 複数の AJAX 呼び出しにより、Spring MVC リクエストインターセプターが奇妙な動作をしますか?

ここで助けてくれてありがとう!

4

2 に答える 2

1

構成が示されているとおりに見える場合、インターセプター宣言は有効になりません。インターセプター宣言を に入れる必要があります。Bozho's answer<mvc:interceptors>を参照してください。

複数の AJAX クエリに関しては、これらのクエリが Spring MVC コントローラーによって処理される限り問題ありません。デフォルトでは、インターセプターはコントローラーに送信されるすべてのリクエストをインターセプトしますが、必要に応じてスコープを特定の URL パターンに絞り込むことができます。

于 2012-05-16T16:23:35.450 に答える
0

Springは、XML構成に関しては非常に厄介な場合があり、Webから見つけたスニペットを追加しても、最も些細な例であっても機能しないことがよくあります。構成について詳しく知らなければ、これを再現して、構成が間違っているか、インターセプター宣言と競合している場所を確認することは困難です。

HttpHeadersオブジェクトのインスタンスを宣言し、それらを構成し、それらを応答エンティティ(使用しているように見えるもの)として含めることにより、いつでもコントローラーにキャッシュ禁止ヘッダーを返すように強制できます。

HttpHeaders headers = new HttpHeaders();
headers.add("Pragma", "no-cache");
headers.add("Expires", "Thu, 01 Jan 1970 00:00:00 GMT");
headers.add("Cache-Control", "max-age=0, no-cache, no-store");

多くのコントローラーがあり、各コントローラーに多くのメソッドがある場合、これは多くの反復的で厄介なコードになります。代わりにあなたは拡張することができますHttpHeaders

public class YourAppHeaders extends HttpHeaders {
    public YourAppHeaders()            
        add("Pragma", "no-cache");
        add("Expires", "Thu, 01 Jan 1970 00:00:00 GMT");
        add("Cache-Control", "max-age=0, no-cache, no-store");
    }
}

次に、それぞれのソースファイルを調べて、新しいインスタンスを@Controller検索/置換します。HttpHeadersYourAppHeaders

いくつかの理由から、XML構成よりもこのアプローチをお勧めします。

  • XML構成が機能しておらず、その理由を理解するのに十分な情報がありません。と
  • この方法は確実に機能します。と
  • これは、探していることを達成するために追加できる最小限のコードです。

幸運を祈ります-HTH

于 2012-05-18T21:03:42.293 に答える