【问题标题】:HttpURLConnection addRequestProperty with "Cookie" resulting in comma separated Cookie string?带有“Cookie”的 HttpURLConnection addRequestProperty 导致逗号分隔的 Cookie 字符串?
【发布时间】:2019-08-26 00:44:09
【问题描述】:

我必须从 Java 代码中模拟浏览器行为。

在将请求发布到服务器之前,我必须设置两个 cookie。

我这样做:

HttpURLConnection conn = ...
...
conn.addRequestProperty("Cookie", "IDS_SSO_ID=" + "onething");
conn.addRequestProperty("Cookie", "JSESSIONID=" + "otherthing"));
...
conn.close();

在服务器日志中,我看到“IDS_SSO_ID”cookie 被检索为“onething, JSESSIONID”,这会导致错误。

请注意,我无法访问服务器,也无法访问服务器的源代码,我只有日志。

我应该如何使用 HttpURLConnection 设置 cookie?


所以,我创建了一个小型演示;如果我使用“addRequestProperty”,则会发送不正确的 cookie 标头:

URL url = new URL("https://en0hphl04qcwvf.x.pipedream.net/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.addRequestProperty("Cookie", "JSESSIONID=akarmi123");
conn.addRequestProperty("Cookie", "IDS_SSO_ID=netudd321");

byte[] bytes = StreamUtils.copyToByteArray(conn.getInputStream());
System.out.println("response: " + new String(bytes));
conn.disconnect();

cookie 标头值为:JSESSIONID=akarmi123, IDS_SSO_ID=netudd321

如果我使用 'setRequestProperty' 并手动构造 cookie 标头,则会发送正确的 cookie 标头:

conn = (HttpURLConnection) url.openConnection();

conn.setRequestProperty("Cookie", "JSESSIONID=akarmi123; IDS_SSO_ID=netudd321");

bytes = StreamUtils.copyToByteArray(conn.getInputStream());
System.out.println("response: " + new String(bytes));
conn.disconnect();

cookie 标头值为:JSESSIONID=akarmi123; IDS_SSO_ID=netudd321

奇怪的是,网络上的很多资源(以及这里的 SO 中也是如此)推荐了我的第一种方法——多次调用 addRequestProperty(...):

How to set Cookies at Http Get method using Java

https://www.codota.com/code/java/methods/java.net.URLConnection/addRequestProperty

https://www.programcreek.com/java-api-examples/?class=java.net.HttpURLConnection&method=addRequestProperty

http://www.massapi.com/method/ad/addRequestProperty-2.html

但是好像他们错了……

【问题讨论】:

    标签: java cookies httpurlconnection


    【解决方案1】:

    一种可能性是通过执行以下操作来强制正确连接 cookie 字符串:

    conn.addRequestProperty("Cookie", "JSESSIONID=" + "otherthing" + ";IDS_SSO_ID=" + "onething");
    

    您描述的行为在我看来是一种意外行为。

    【讨论】:

    • 确实,如果我按照您的建议手动构建“Cookie”请求标头,那么一切正常。请注意,在这种情况下,我宁愿使用 setRequestProperty(...) btw。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多