14

通过 URLConnection 发送“完整”cookie 的正确方法是什么?

我一直在使用:

URL url = new URL(page);  
URLConnection urlConn = url.openConnection(); 

urlConn.setRequestProperty("Cookie", myCookie); 

urlConn.setUseCaches(true); 

urlConn.connect();

myCookie 值为 testCookie=d1lEZk9rSHd3WnpBd2JkWGRhN1RYdz09OkEwQ21pSFJVZzBpVDhhUENaK3ZPV2c9PQ

有没有办法用它发送路径、域和过期?您是否需要以某种方式对值进行编码?

4

2 回答 2

30

这个(当前接受的)答案是错误的 - 对于 http客户端,您使用; 分隔符来表示多个 cookie 值,因此他的示例实际上发送了三个 cookie:

  • user=mary17
  • domain=airtravelbargains.com
  • path=/autos

如果我们谈论的是服务器响应和Set-Cookie标头,那么答案是正确的,但我们不是 - urlconnection 用于客户端连接到服务器。

那么,您要求的Domain, Expires,信息呢?Path问题是,您不打算发送该信息。Path、Domain 和 Expires 只是用于发送到浏览器(或任何其他 HTTP 客户端)的指令,因为它们是针对客户端的指令。您只是要将有效的 cookie发送到服务器,因此无法发送您要求的信息,因为它没有任何意义。

您可以通过浏览浏览器中的任何 HTTP 会话自己看到这一点。浏览器只会发送这样的东西:

Cookie: cookiename=value; anothercookie=othervalue;

这是应该的。

或者,您可以检查RFC 6265,您可以直接从目录中看到Domain,是标头ExpiresPath属性Set-Cookie(发送到浏览器),而不是标头的属性Cookie(由浏览器或其他 http 客户端发送到服务器)。

于 2014-11-23T21:22:18.187 回答
9

好吧,如果你只是设置一个 cookie,我想你可以简单地这样做:

urlConn.setRequestProperty("Cookie", "user=mary17; domain=airtravelbargains.com; path=/autos");

如果您设置的 cookie 不止一个,您可能会改用该addRequestProperty方法。

对于 expires 属性,请确保使用以下格式:Weekday, DD-Mon-YY HH:MM:SS GMT。

唯一合法的时区是 GMT,日期元素之间的分隔符必须是破折号。

于 2012-10-06T16:14:57.100 回答