Я не могу правильно установить свойство user-agent
для подключения https. Из того, что я собрал, свойства http-заголовка могут быть заданы либо с помощью опции -Dhttp.agent
VM, либо через URLConnection.setRequestProperty()
. Однако установка пользовательского агента через опцию VM приводит к тому, что "Java/[версия]" добавляется к любому значению 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();
Я нашел/подтвердил эту проблему, проверив http-протоколы с помощью WireShark. Есть ли способ обойти это?
Обновление: дополнительная информация
Кажется, я не выглядел достаточно глубоко в сообщении. Код запускается из-за прокси-сервера, поэтому наблюдаемое сообщение противоречит прокси-серверу, установленному через -Dhttps.proxyHost
, а не целевому веб-сайту (google.com). Во всяком случае, во время соединения https метод CONNECT
, а не GET
. Вот проводка захвата https-связи. Как я уже упоминал выше, пользовательский агент устанавливается через -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-соединения, и прокси также отказывается от соединения. Надеюсь, я не схожу с ума:).