【问题标题】:Cannot set servlet cookies using Tomcat无法使用 Tomcat 设置 servlet cookie
【发布时间】:2015-04-09 16:53:51
【问题描述】:

我有以下代码作为自定义过滤器的一部分运行:

Cookie cookie = new Cookie("NAME", "VALUE");
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);

使用 Jetty 服务器运行 UT 时,我从 servlet 成功接收到 cookie。 然而,当我运行本地 Tomcat 服务器(使用 IntelliJ)时,甚至没有在服务器端设置 cookie(即不是客户端问题)。我能看到的唯一 cookie 是 jsessionid cookie。

我尝试了以下方法,但没有成功:

  1. setDomain("")
  2. setPath("/")
  3. response.flushBuffer() 添加 cookie 后。

我在添加新 cookie 后立即打印所有响应 cookie,但我的 cookie 未列出。

Collection<String> headers = ((HttpServletResponse) res).getHeaders("Set-Cookie");
for (String header : headers) {
    System.out.println("Session Cookie:" + header);
}

总的来说,我对 Web 应用程序和 Java 还很陌生,所以我也可能错过了一些非常基本的东西。 在这里将不胜感激。

【问题讨论】:

  • 您的过滤器是否已正确注册? (在 web.xml 中,如果 servlets 2.X 或在 servlets 3.X 中这样注释)
  • 是的。过滤器按预期执行。添加新 cookie 后,我打印所有 cookie,但未列出我刚刚添加的 cookie。

标签: java servlets cookies tomcat8


【解决方案1】:

我在这里找到了答案:http://www.coderanch.com/t/577383/jforum/response-addCookie-work-filter

简而言之:“添加 cookie 需要修改响应的 HTTP 标头。一旦“提交”响应,例如写入输出流的任何内容,您就无法修改 HTTP 标头。响应已由您尝试添加 cookie 的时间...大多数 JSP 实现和一些 servlet 实际上会在缓冲区中生成响应。这意味着响应未提交,输出已关闭或手动刷新。因此,这在某些应用程序中有效而不是其他人”。

归根结底,我需要在调用 chain.doFilter(req, res) 之前更新响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2011-06-02
    相关资源
    最近更新 更多