如何在 URLConnection 中发送 cookie?

Posted

技术标签:

【中文标题】如何在 URLConnection 中发送 cookie?【英文标题】:How to send a cookie in a URLConnection? 【发布时间】:2012-09-27 11:55:00 【问题描述】:

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

我一直在使用:

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

urlConn.setRequestProperty("Cookie", myCookie); 

urlConn.setUseCaches(true); 

urlConn.connect();

myCookie 的值为 testCookie=d1lEZk9rSHd3WnpBd2JkWGRhN1RYdz09OkEwQ21pSFJVZzBpVDhhUENaK3ZPV2c9PQ

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

【问题讨论】:

【参考方案1】:

This (currently accepted) answer 是错误的 - 对于 http clients 你使用 ; 分隔多个 cookie 值,所以他的示例实际上发送了三个 cookie:

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

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

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

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

Cookie: cookiename=value; anothercookie=othervalue;

应该是这样的。

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

【讨论】:

【参考方案2】:

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

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

如果您设置的 cookie 不止一个,则可以改用 addRequestProperty 方法。

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

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

【讨论】:

以上是关于如何在 URLConnection 中发送 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

利用URLConnection来发送POST和GET请求

Android URLConnection发送Get请求 HttpGet封装

如何在java中重置URLConnection?

5URLConnection

wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

如何在 java.net.URLConnection 上指定本地地址?