Java Servlet API 2.5 Cookie.getDomain() 总是返回 null

Posted

技术标签:

【中文标题】Java Servlet API 2.5 Cookie.getDomain() 总是返回 null【英文标题】:Java Servlet API 2.5 Cookie.getDomain() always returns null 【发布时间】:2010-11-05 08:12:03 【问题描述】:

我在 Tomcat 上使用 Servlet API 2.5 的 Cookie 类时遇到问题。我从 HttpServletRequest 对象中提取 cookie 列表并像这样遍历它们:

Cookie[] cookies = request.getCookies();

for(Cookie cookie : cookies) 
    System.out.println("Name=" + cookie.getName() + " Domain=" + cookie.getDomain());

但是,对于请求中的每个 cookie,域都是空的。为什么是这样?我问的原因是因为我在两个不同的域中有一个同名的 cookie,我希望能够根据域来区分它们。为了帮助澄清这种情况,我在 .anydomain.net 和 .subdomain.anydomain.net 中设置了同名 cookie。两者都在请求中发送,但是当它们到达 servlet 时域为空。 servlet 看不到发送给它的 cookie 的域是预期的行为吗?

编辑:我在对 servlet 的上一个请求中设置了 cookie 以及域、到期时间和路径。使用这些 cookie 进入浏览器的下一个请求将域显示为空。我已验证 cookie 已设置在浏览器的正确域中。

编辑 2:我使用的是 Tomcat 6

【问题讨论】:

您可以在 setName() 和 setDomain() 方法上设置断点来检查 servlet 容器是否正确解析了 cookie 标头。您的 cookie 中有冒号 (:) 吗?一些最新的 Tomcat 版本不接受大多数带有冒号的 cookie。 【参考方案1】:

您确定可以从请求 cookie 中获取除值之外的任何内容吗? 浏览器将仅在 HTTP Cookie 标头中发送 name=value。

其他属性(安全、域、路径、过期)仅适用于您自己设置到响应中的 cookie。 它们用于创建 Set-Cookie 响应标头。

【讨论】:

【参考方案2】:

只有当 cookie 是响应的一部分时(即在 Set-Cookie 标头中),诸如域之类的属性才用于 cookie。客户端(例如 Web 浏览器)应该只发送具有正确域(路径等)的 cookie。因此,请求只能看到值,因为标头本身(Cookie)只包含值。您的客户端不应将 cookie 从不同的域发送到服务器。

【讨论】:

以上是关于Java Servlet API 2.5 Cookie.getDomain() 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Java Servlet 2.3/2.4/2.5/3.0/3.1/4.0 各web.xml文件

如何配置 maven 以使用 servlet 3

不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息

配置jsp相关

急急急!!!简单问题,java的response和request用法,需要import那个包???

maven The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Pa