考虑这个过滤器:
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
public class CookieStoringFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
if(res instanceof HttpServletResponse) {
chain.doFilter(req, new CookieStoringResponse((HttpServletResponse)res));
} else {
chain.doFilter(req, res);
}
}
public void init(FilterConfig config) throws ServletException {
}
}
它将响应包装成一个叫做 CookieStoringResponse 的东西:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CookieStoringResponse extends HttpServletResponseWrapper {
protected List<Cookie> cookies;
public CookieStoringResponse(HttpServletResponse response) {
super(response);
}
public void addCookie(Cookie c) {
cookies.add(c);
super.addCookie(c);
}
public List<Cookie> getCookies() {
return cookies;
}
}
安装此过滤器后(在 web.xml 中)
<filter>
<filter-name>cookieFilter</filter-name>
<filter-class>CookieStoringFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cookieFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后您可以检查响应是否属于 cookie 计数类型,然后检索添加的 cookie 列表:
public void doGet(HttpServetRequest req, HttpServletResponse res) {
if(res instanceof CookieStoringResponse)) {
System.out.println("I have " + ((CookieStoringResponse)res).getCookies().size() + " cookies stored");
}
}
请记住,Cookie 也可以通过 Header-Values 设置 - 所以这可能只是一个起点。