我有一个缓存Servlet过滤器,如果在响应中设置了cookie,我如何确保它不发送缓存标头?

问题描述:

我有一个缓存Servlet过滤器,对于某些URL,过滤器会将Cache-Control: public, max-age=x标题添加到响应中。我有一个缓存Servlet过滤器,如果在响应中设置了cookie,我如何确保它不发送缓存标头?

但它不应公开缓存任何设置任何cookie的响应。如何检查以确保响应没有设置cookie(包括确保servlet容器不会发送JSESSIONID)?

您可以使用HttpServletResponseWrapper

public void doFilter(..) { 
    chain.doFilter(request, new Wrapper(response)); 
} 

其中Wrapper延伸HttpServletResponseWrapper,覆盖addCookie方法,调用super.addCookie(..)并设置一个布尔值,true,这意味着一个cookie已添加。该布尔值可以位于包装的字段中,也可以作为请求属性。无论哪种方式,您可以稍后阅读它,当你需要检查是否添加了一个cookie。

对于jsessionid(附加到URL),您可以覆盖encodeRedirectURL,并检查调用super.encodeRedirectURL(..)是否将追加JSESSIONID

但不缓存正在发送会话cookie可能是错误的资源。任何资源可能会发送一个会话cookie,如果它是第一个打开的话。

+0

好主意。这是否适用于由servlet容器设置的JSESSIONID? – Kyle 2011-05-12 23:25:41

+0

看到更新.... – Bozho 2011-05-12 23:28:31

+0

我刚刚尝试过它,它正确地检测到我的代码添加的任何cookie,但它发送JSESSIONID cookie时不会调用过旧的'encodeRedirectURL'或'addCookie'。 – Kyle 2011-05-12 23:41:14