我有一个缓存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,如果它是第一个打开的话。
好主意。这是否适用于由servlet容器设置的JSESSIONID? – Kyle 2011-05-12 23:25:41
看到更新.... – Bozho 2011-05-12 23:28:31
我刚刚尝试过它,它正确地检测到我的代码添加的任何cookie,但它发送JSESSIONID cookie时不会调用过旧的'encodeRedirectURL'或'addCookie'。 – Kyle 2011-05-12 23:41:14