【问题标题】:When a cookie is sent via http header to a browser will it be added to the client browser?当通过 http 标头将 cookie 发送到浏览器时,它会被添加到客户端浏览器吗?
【发布时间】:2015-07-22 05:03:49
【问题描述】:

我正在尝试与 API 建立连接。当我调用这个 API 的方法时,它会响应一个通过 HTTP 标头发送的 cookie 值。

此标头会自动添加到客户端“我的浏览器”吗?还是我必须先解析请求并使用setCookie 创建一个cookie?

如果它没有自动添加cookies,有没有办法这样做?

【问题讨论】:

    标签: javascript php api http-headers httpcookie


    【解决方案1】:

    它将由您的 http 客户端自动处理(您无需手动设置)。 服务器应使用 Set-Cookie 标头(而不是 cookie)响应,然后客户端将保存该 cookie,并在下一次请求时发送。

    设置 cookie

    Cookie 使用 HTTP Set-Cookie 标头设置,在 HTTP 响应中发送。此标头指示浏览器存储 cookie 并在以后的请求中将其发送回服务器(如果浏览器不支持 cookie 或禁用了 cookie,当然会忽略此标头)。

    例如,浏览器将它的第一个请求发送到 www.example.org 网站的主页:

    GET /index.html HTTP/1.1
    Host: www.example.org
    ...
    

    服务器用两个 Set-Cookie 头响应:

    HTTP/1.0 200 OK
    Content-type: text/html
    Set-Cookie: theme=light
    Set-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT
    ...
    

    服务器的 HTTP 响应包含网站主页的内容。但它也指示浏览器设置两个 cookie。第一个“主题”被认为是“会话”cookie,因为它没有 Expires 或 Max-Age 属性。会话 cookie 通常会在浏览器关闭时被浏览器删除。第二个,“sessionToken”包含一个“Expires”属性,指示浏览器在特定日期和时间删除cookie。

    接下来,浏览器发送另一个请求以访问网站上的 spec.html 页面。该请求包含一个 Cookie 标头,其中包含服务器指示浏览器设置的两个 Cookie。

    GET /spec.html HTTP/1.1
    Host: www.example.org
    Cookie: theme=light; sessionToken=abc123
    ...
    

    这样,服务器就知道这个请求和前一个请求相关。服务器将通过发送请求的页面来响应,并可能使用 Set-Cookie 标头添加其他 cookie。

    服务器可以通过在响应页面请求时包含 Set-Cookie 标头来修改 cookie 的值。然后浏览器将旧值替换为新值。

    cookie 的值可以包含任何可打印的 ASCII 字符(! 到 ~,unicode \u0021 到 \u007E),不包括 , 和 ;并且不包括空格。 cookie 的名称不包括相同的字符以及 =,因为这是名称和值之间的分隔符。 cookie 标准 RFC 2965 限制更多,但浏览器并未实现。

    术语“cookie crumb”有时用于指代 cookie 的名称-值对。

    Cookie 也可以通过在浏览器中运行的脚本语言(例如 JavaScript)来设置。在 JavaScript 中,对象 document.cookie 用于此目的。例如,指令 document.cookie = "temperature=20" 创建一个名称为 "temperature" 且值为 "20" 的 cookie。

    wikipedia page

    【讨论】:

    • 感谢您提供的详细信息。为了确保我完全理解这种行为,如果 API 向我发送了一个过期时间为 1 小时的 cookie,并且用户关闭了浏览器,那么在 30 分钟后用户再次打开它。当再次调用 API 时,标头会自动从客户端发送到服务器,还是我必须确保每次手动将标头添加到 cURL 请求中以便发送?
    • 是的,会自动删除。所以请求不会包含过期的cookies。
    • 但是它会自动添加到每个请求中直到它过期还是我每次都必须使用CURLOPT_HTTPHEADER将它添加到cURL请求中“因此我不必管理来自/to API 内部”?
    • 它会自动添加到所有请求中
    • 出于某种原因,如果我不手动将标头添加到CURLOPT_HTTPHEADER,API 不会收到标头。为什么会导致这个问题?我必须为 cURL 设置一个选项以通过 HTTP 标头自动包含设置的标头吗?我厌倦了使用curl_setopt($ch, CURLOPT_COOKIE, true);,但它没有自动包含标题
    【解决方案2】:

    是的,cookie 将被添加到 document.cookie,除非在发送 cookie 时设置了 httponly 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2010-09-18
      • 2019-08-19
      相关资源
      最近更新 更多