【问题标题】:Can cookies be set from 4xx responses?可以从 4xx 响应中设置 cookie 吗?
【发布时间】:2014-02-04 13:46:32
【问题描述】:

当我检测到特定的客户端错误时,我刚刚尝试设置(实际上是通过将最大年龄设置为 0 来删除)会话 cookie。我使用的 HTTP 响应来自 4xx 类别(例如 401、406 等)。

在服务器端生成这种响应时,cookie 删除工作正常:

            Response resp = Response.status(Response.Status.OK).header(
                "Set-Cookie",
                cookieName+"="+sessionId+"; "+
                "Version=1; Max-Age=0; Path=" + cookiePath + "; " +
                "Expires=Thu, 01 Jan 1970 00:00:00 GMT").entity("").build();

...但是失败了:

            Response resp = Response.status(Response.Status.UNAUTHORIZED).header(
                "Set-Cookie",
                cookieName+"="+sessionId+"; "+
                "Version=1; Max-Age=0; Path=" + cookiePath + "; " +
                "Expires=Thu, 01 Jan 1970 00:00:00 GMT").entity("").build();

(唯一的区别:200 => 406)。

4xx响应不能设置cookie是真的吗?

【问题讨论】:

  • 你测试过多个浏览器吗?如果Set-Cookie 标头确实存在,您是否检查过浏览器的开发人员工具?这也可能与Response 类的实现有关。

标签: http cookies http-status-code-406


【解决方案1】:

RFC 6265 声明必须接受这些 cookie:

源服务器可以发送一个 Set-Cookie 响应标头,其中包含任何 回复。用户代理可以忽略包含在 具有 100 级状态代码的响应,但必须处理 Set-Cookie 其他响应中包含的标头(包括带有 400- 和 500 级状态码)。一个源服务器可以包含多个 单个响应中的 Set-Cookie 标头字段。一个的存在 Cookie 或 Set-Cookie 标头字段不排除 HTTP 缓存 从存储和重用响应。

【讨论】:

  • 我知道这很奇怪 - 感谢您证明这看起来像一个浏览器错误(我正在使用 Firefox26/Linux 进行编码)。
猜你喜欢
  • 2011-03-21
  • 2018-12-11
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2020-07-24
  • 2012-03-25
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多