【问题标题】:Handling cookies in an HTTP server在 HTTP 服务器中处理 cookie
【发布时间】:2016-09-14 07:01:27
【问题描述】:

这是我第一次在这个网站上发帖,但我经常来。我被困在一个我正在编写有趣的项目上。我是 Perl 的新手,所以请放轻松。我已经成功地用 Perl 编写了一个 Web 服务器,它解析 PHP 并处理多个连接。

到目前为止,一切都很好,但我一直在向浏览器发送 cookie。

我想我不明白我的服务器在发送 cookie 之前应该如何解析文档输出(从读取文件到通过 HTTP 发送)。我已经搜索了好几天,结果都是空的。可能我过于复杂了,但我应该如何知道文档要求发送的键值是什么?

使用HTTP::Cookies 仅搜索从网络解析文档的着陆页,这不是我想要的。在服务器端解析本地文档以获取“Set-Cookie:”之前会发生什么情况,然后再发送标头?

我试过HTTP::Cookies->extract_cookies($my_local_file),但它的回应是

“无法通过包定位对象方法“_header”...”

这是有道理的,因为头文件从未发送过,因为它发生在服务器端。

【问题讨论】:

  • Re "在服务器端解析本地文档以获取 "Set-Cookie:" 在发送标头之前会发生什么?" 这是什么意思? Set-Cookie 是 HTTP 服务器在响应中包含的标头,而不是在文档中找到的内容。
  • 相关规范为RFC 6265Cookie::Baker 似乎生成(值)Set-Cookie 标头。
  • 如果您使用 Apache mod_perl2,我建议您检查Net::API::REST::Cookies,它处理从 Web 浏览器接收并由服务器发送到 Web 浏览器的 cookie。

标签: perl cookies webserver httpserver io-socket


【解决方案1】:

您误解了 Cookie 的工作原理。它们由服务器指定存储在客户端,所以这个问题没有意义

我想我不明白我的服务器在发送 cookie 之前应该如何解析文档输出(从读取文件以通过 HTTP 发送)。

我可能过于复杂了,但我应该如何知道文档要求发送的键值是什么?

在服务器端在发送标头之前解析本地文档以获取“Set-Cookie:”会发生什么?

服务器不“发送 cookie”。当服务器接收到来自客户端的 HTTP 请求时,它会构建并发送包含客户端请求的信息的响应。该响应可能包含Set-Cookie 标头以指示客户端保存一些信息

文档不能“请求发送”键值——它只是一个文档!——并且没有“本地文档的解析”。如果客户端向同一主机发送另一个请求,服务器只需添加定义要返回的数据的标头

如果要求很简单,那么每个数据项都可以出现在标题中。比如

Set-Cookie: localtime=2016-05-18T09:01:16
Set-Cookie: username=Keith

但是如果服务器想要存储大量与会话相关的信息(可能是购物篮的内容),那么这可能只是一个会话 ID,它对应于服务器上保存的 MySQL 数据库记录的 ID包含所有相关数据

Set-Cookie: session_id=76151387

这种方法还提高了安全性,因为只有会话 ID 出现在 HTTP 消息中,所有真实数据都保存在服务器上的站点之外

一旦客户端收到响应,它将以它喜欢的任何方式保存 cookie,以便在下一个请求发往同一主机地址时可以检索并返回它们。它将仅包含来自先前响应的数据的副本,如下所示

Cookie: localtime=2016-05-18T09:01:16; username=Keith

Cookie: session_id=76151387

这个基本思想有一些变化;例如,服务器可以指定ExpiresMax-Age 字段,指定客户端何时删除cookie。假设服务器发送

Set-Cookie: session_id=76151387; Max-Age=86400

然后 cookie 将被保存到磁盘,以便在重新启动浏览器时保持不变,并在一天后删除(以秒为单位指定期限)。如果没有这些属性中的任何一个,cookie 就是一个 会话 cookie,它通常保存在内存中,并且会在浏览器关闭时被删除

服务器可以指定其他更深奥的属性。 RFC 6265 是 HTTP cookie 系统的权威规范,详细描述了各个方面

【讨论】:

  • 谢谢...这真的很有帮助。我从您那里了解到,在发送文档之前,我不必解析 cookie。我需要为调用的脚本类型设置我的 Content Type 标头。一旦我这样做了,它就起作用了。
  • @KeithKirkland:我不知道你从哪里得到的想法,你必须解析一些东西来获得Set-Cookie 值。它们的内容取决于您要使用 cookie 的目的,但它可能与您发送的文档的内容无关。 Content-Type 标头应该反映您发送的数据类型,可能是“被调用的脚本类型”,虽然我不是确定你的意思,但不一定是。
【解决方案2】:

当浏览器向网络服务器发送请求时,标头可能包含 cookie 行。这是 Web 浏览器将其 cookie 连同 Web 请求一起呈现给 Web 服务器。请求可能如下所示:

GET /index.html HTTP/1.1
Host: YourURL.com
Cookie: key=value; key=value; key=value

如果您要解析对服务器的原始请求,请解析 cookie 行中的值。

HTTP::Server::Simple 是一个嵌入式 CPAN 库,如果您不想重新发明轮子,它提供了一个功能齐全的 Web 服务器。

【讨论】:

  • 他们询问“向浏览器发送 cookie”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多