Srishti123
Srishti123

Reputation: 63

clear cache interceptor struts2 not working

I have written an interceptor to prevent caching but the pages still cache.

Interceptor:

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>

Application works fine; it executes interceptor but it doesn't prevent caching.

Upvotes: 1

Views: 4725

Answers (1)

Srishti123
Srishti123

Reputation: 63

I have solved my problem. Thanks to developer tools for helping me to trace out.

A slight sequence change in my code helped me out: as per the Struts 2 interceptor docs the result is rendered before invocation.invoke() returns. Setting the headers before the result is rendered back to the client sets the headers in the returned result.

i.e.,

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();
}

Upvotes: 1

Related Questions