1

キャッシュを防ぐためにインターセプターを作成しましたが、ページは引き続きキャッシュされます。

インターセプター:

public class ClearCacheInterceptor implements Interceptor {
    public String intercept(ActionInvocation invocation)throws Exception{
        String result = invocation.invoke();

        ActionContext context = (ActionContext) invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
        HttpServletResponse response=(HttpServletResponse) context.get(StrutsStatics.HTTP_RESPONSE);

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

        return result;
    }

    public void destroy() {}
    public void init() {}
}

Struts.xml

<struts>
  <constant name="struts.devMode" value="true"/>
  <constant name="struts.enable.DynamicMethodInvocation" value="false" />

  <package name="default" extends="struts-default">
    <interceptors>  
      <interceptor name="caching" class="com.struts.device.interceptor.ClearCacheInterceptor"/>
      <interceptor-stack name="cachingStack">      
        <interceptor-ref name="caching" />     
        <interceptor-ref name="defaultStack" />    
      </interceptor-stack> 
    </interceptors>

    <action name="Login" class="struts.device.example.LogIn">
      <interceptor-ref name="cachingStack"/>
      <result>example/Add.jsp</result>
      <result name="error">example/Login.jsp</result>
    </action>
  </package>
</struts>

アプリケーションは正常に動作します。インターセプターを実行しますが、キャッシュを妨げません。

4

1 に答える 1

1

私は自分の問題を解決しました。追跡を支援してくれた開発者ツールに感謝します。

コードのわずかなシーケンス変更が役に立ちました。Struts2インターセプターのドキュメントによると、結果は返される にレンダリングされinvocation.invoke()ます。結果がクライアントに返される前にヘッダーを設定すると、返される結果にヘッダーが設定されます。

すなわち、

public String intercept(ActionInvocation invocation)throws Exception{
    HttpServletResponse response = ServletActionContext.getResponse();

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

    return invocation.invoke();
}
于 2012-08-20T09:38:28.317 に答える