1

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

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

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

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

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

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

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

4

2 回答 2

2

您误解了 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

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

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

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

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

于 2016-05-18T08:12:27.780 回答
0

当浏览器向 Web 服务器发送请求时,标头可能包含 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 服务器。

于 2016-05-18T04:01:45.350 回答