Java JSP过滤器,如果不存在则设置cookie

时间:2018-03-21 19:00:32

标签: java jsp cookies filter

我的问题是:如何通过过滤器设置尚未存在的cookie?

我理解过滤器是如何工作的,我可以在它到达给定的servlet之前捕获传入的请求,处理请求并将其传递给servlet。当servlet比生成响应时,我可以捕获传出响应并再次使用它。

enter image description here

我所做的,是根据请求确定特定的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。

1 个答案:

答案 0 :(得分:1)

Cookie在HTTP标头中设置。标头是作为响应的一部分编写的第一件事。 Servlet容器只在将响应(首先是标头)写入客户端之前缓冲了大量响应。写入标头后,响应将被视为已提交。 (应用程序也可以强制提交响应。)一旦响应已经提交,就无法添加cookie(因为HTTP标头已经发送到客户端)。

我强烈怀疑在你尝试添加cookie时提交了响应,因此忽略了调用。

简单的解决方案是在调用(len(df1), len(df2))

之前将通话移至addCookie()