我无法正确地设置https连接的user-agent
属性。据我所知,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捕获。像我上面提到的,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连接的用户代理中,代理也拒绝连接。希望我没有疯掉 :)
<!doctype html><html itemscope="itemscope" itemtype= ...
- Deepak Bala