【发布时间】:2013-03-28 12:38:10
【问题描述】:
我无法为 https 连接正确设置 user-agent 属性。根据我收集的信息,可以通过-Dhttp.agent VM 选项或URLConnection.setRequestProperty() 设置http-header 属性。但是,通过 VM 选项设置用户代理会导致将“Java/[version]”附加到 http.agent 的任何值。同时setRequestProperty() 仅适用于 http 连接,不适用于 https(至少在我尝试过时)。
java.net.URL url = new java.net.URL( "https://www.google.com" );
java.net.URLConnection conn = url.openConnection();
conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0");
conn.connect();
java.io.BufferedReader serverResponse = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream()));
System.out.println(serverResponse.readLine());
serverResponse.close();
我通过使用 WireShark 检查 http 通信发现/验证了问题。有没有办法解决这个问题?
更新:添加信息
看来我对交流的了解不够深入。代码从代理后面运行,因此观察到的通信是针对代理的,通过-Dhttps.proxyHost 设置,而不是目标网站 (google.com)。无论如何,在https连接期间,方法是CONNECT,而不是GET。这是 https 通信尝试的wireshark 捕获。就像我上面提到的,user-agent 是通过-Dhttp.agent 设置的,因为URLConnection.setRequestProperty() 没有效果(user-agent = Java/1.7.0)。在这种情况下,请注意附加的 Java/1.7.0。问题仍然存在,为什么会发生这种情况,我该如何解决?
CONNECT www.google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0 Java/1.7.0
Host: www.google.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
HTTP/1.1 403 Forbidden
X-Bst-Request-Id: MWPwwh:m7d:39175
X-Bst-Info: ch=req,t=1366218861,h=14g,p=4037_7213:1_156,f=PEFilter,r=PEBlockCatchAllRule,c=1905,v=7.8.14771.200 1363881886
Content-Type: text/html; charset=utf-8
Pragma: No-cache
Content-Language: en
Cache-Control: No-cache
Content-Length: 2491
顺便说一句,请求被禁止是因为代理过滤了用户代理,Java/1.7.0 导致了拒绝。我已将 Java/1.7.0 附加到 http 连接的用户代理,并且代理也拒绝连接。我希望我不会发疯:)。
【问题讨论】:
-
我没有看到您描述的行为。使用您的代码块(并更改 url)我的访问日志显示: [11/Apr/2013:18:35:05 +0000] "GET / HTTP/1.1" 200 17353 "-" "Mozilla/5.0 (Windows NT 5.1 ; rv:19.0) Gecko/20100101 Firefox/19.0" "-"。这个请求也是通过 https,使用 OS X。
-
@JasonNichols 我正在运行带有 Java 1.7.0_17 的 Windows XP
-
用HttpClient怎么样?
-
@Vitaly 当我遇到这个问题时,我实际上是在尝试使用 netbeans 测试 Web 服务连接。使用 HttpClient 将是最后的手段。
-
刚刚在 java 7 上尝试过,并且能够设置标题并提取内容。回复 -
<!doctype html><html itemscope="itemscope" itemtype= ...
标签: java https http-headers