我的问题是:如何通过过滤器设置尚未存在的cookie?
我理解过滤器是如何工作的,我可以在它到达给定的servlet之前捕获传入的请求,处理请求并将其传递给servlet。当servlet比生成响应时,我可以捕获传出响应并再次使用它。
我所做的,是根据请求确定特定的cookie不存在所以我设置了一个表示这个的布尔值。与响应从servlet返回时相比,我添加了特定的cookie。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
ServletContext sc = filterConfig.getServletContext();
//Run when receiving the request from the client
boolean cookie = false;
System.out.println("Searching for the cookie (request)");//debug
Cookie[] cookies = httpRequest.getCookies();
if(cookies != null) {
for(int a = 0; a < cookies.length; a++) {
if(cookies[a].getName().equals("PositionCookie")) {
cookie = true;
}
}
}
chain.doFilter(httpRequest, httpResponse);
//Run when sending the response to the client
System.out.println("Determining to create cookie (response)");//Debug
if(!cookie) {
System.out.println("Creating 'PositionCookie' (response)");//debug
Cookie c = new Cookie("PositionCookie", "/test/data/string");
c.setPath("/");
c.setMaxAge(-1);
httpResponse.addCookie(c);
}
}
因为我只想将它作为会话cookie,所以我给它的MaxAge为-1。 所有的调试行都被激活并写入catalina.out所以我知道已经达到新的Cookie语句但是新的cookie没有添加到浏览器保存的cookie中。我没有任何拒绝新cookie的浏览器设置,我可以毫无问题地获得JSESSIONID cookie。
答案 0 :(得分:1)
Cookie在HTTP标头中设置。标头是作为响应的一部分编写的第一件事。 Servlet容器只在将响应(首先是标头)写入客户端之前缓冲了大量响应。写入标头后,响应将被视为已提交。 (应用程序也可以强制提交响应。)一旦响应已经提交,就无法添加cookie(因为HTTP标头已经发送到客户端)。
我强烈怀疑在你尝试添加cookie时提交了响应,因此忽略了调用。
简单的解决方案是在调用(len(df1), len(df2))
addCookie()