我无法正确设置user-agent
https 连接的属性。根据我收集到的信息,http-header 属性可以通过-Dhttp.agent
VM 选项或通过URLConnection.setRequestProperty()
. 但是,通过 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 捕获。就像我上面提到的,用户代理是通过设置的,-Dhttp.agent
因为URLConnection.setRequestProperty()
没有效果(用户代理 = 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 连接的用户代理,并且代理也拒绝连接。我希望我不会发疯:)。