Java URLConnection의 사용자 에이전트 설정


80

URLConnection과 함께 Java를 사용하여 웹 페이지를 구문 분석하려고합니다. 다음과 같이 사용자 에이전트를 설정하려고합니다.

java.net.URLConnection c = url.openConnection();
c.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

그러나 결과 사용자 에이전트는 끝에 "Java / 1.5.0_19"가 추가 된 내가 지정한 것입니다. 이 추가없이 사용자 에이전트를 진정으로 설정하는 방법이 있습니까?


이것이 결과 사용자 에이전트인지 어떻게 알 수 있습니까? 어디에서 보십니까?
skaffman

1
PHP로 가져 와서 Java가 가져 오는 페이지에 표시합니다.
DiglettPotato

이것은 실제로 작동합니다. 두 번째 답변을 참조하십시오.
rogerdpack

답변:


71

손으로 http.agent시스템 속성을로 설정하면 ""트릭을 수행 할 수 있습니다 (제 앞에 코드가 없습니다).

다음과 같이 벗어날 수 있습니다.

 System.setProperty("http.agent", "");

하지만 시작시 값을 캐시하는 경우 사용자와 URL 프로토콜 처리기 초기화 사이의 경쟁이 필요할 수 있습니다 (실제로는 그렇게 생각하지 않습니다).

이 속성은 JNLP 파일 (6u10의 애플릿에서 사용 가능)과 명령 줄을 통해 설정할 수도 있습니다.

-Dhttp.agent=

또는 래퍼 명령의 경우 :

-J-Dhttp.agent=

어떻게할까요? c.setRequestProperty ( "http.agent", "") ;? 나는 다른 곳에서 가정하고있다 ...
DiglettPotato

1
예 ... 그게 매력처럼 작동합니다! 다음을 수행하십시오. System.setProperty ( "http.agent", "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv : 1.9.2.2) Gecko / 20100316 Firefox / 3.6.2"); 그리고 당신은 갈 준비가되었습니다 !! :)
eduardo.lopes

94

설명을 위해 : setRequestProperty("User-Agent", "Mozilla ...")이제 잘 작동 java/xx하며 끝에 추가되지 않습니다 ! 적어도 Java 1.6.30 이상에서는.

netcat (포트 리스너)를 사용하여 내 컴퓨터에서 수신했습니다.

$ nc -l -p 8080

단순히 포트에서 수신 대기하므로 원시 http-headers와 같이 요청 된 모든 것을 볼 수 있습니다.

그리고 setRequestProperty없이 다음과 같은 http-headers를 얻었습니다.

GET /foobar HTTP/1.1
User-Agent: Java/1.6.0_30
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

그리고 setRequestProperty :

GET /foobar HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

보시다시피 사용자 에이전트가 올바르게 설정되었습니다.

전체 예 :

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;


public class TestUrlOpener {

    public static void main(String[] args) throws IOException {
        URL url = new URL("http://localhost:8080/foobar");
        URLConnection hc = url.openConnection();
        hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

        System.out.println(hc.getContentType());
    }

}

2
그래도 Java 1.5를 사용한다면
Dejell 2014

3
@Dejell이 접근 방식이 구식이라고 제안합니까? 나는 Java 7을 사용하고 있으며 이것이 내가 원하는 것을 정확히 수행했습니다.
Shadoninja 2016-06-23

5

나를 위해 그 작업 은 addRequestProperty에서 User-Agent를 설정합니다.

URL url = new URL(<URL>);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.addRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

HttpURLConnection으로 캐스트 할 필요가 없습니다.
jechterhoff

1
@jechterhoff Java 8에서 필요합니다
FonzTech

@FonzTech Java 8에서 캐스트가 필요한 이유를 모르겠습니다. 다음은 내 프로그램에서 작동합니다 (준수는 Java 1.8). URL clSourceUrl = new URL (clSource); URLConnection urlConn = clSourceUrl.openConnection (); urlConn.setRequestProperty ( "User-Agent", "Mozilla / 5.0 (Windows NT 6.1; Win64; x64; rv : 56.0) Gecko / 20100101 Firefox / 56.0"); 자세히 설명해 주시겠습니까?
jechterhoff

@jechterhoff 사용자가 대답을 사용했습니다 HttpURLConnection. 그가 사용했다면 당신이 옳았을 것 URLConnection입니다. 어쨌든, HttpURLConnection c = new URL("http://www.google.com").openConnection();예 를 들어이 줄을 컴파일하려고 javac하면 error: incompatible types그 줄에 줄 것입니다. 나는 자바 (8)의 최신 버전, 그래서 자바 1.8.0 (R172)를 사용하고 있습니다
FonzTech

@FonzTech 아, 이제 무슨 말인지 알겠습니다. 첫 번째 댓글에서 더 정확해야합니다 (죄송합니다). 제가 말하려는 것은 여기서 HttpURLConnection을 전혀 사용할 필요가 없다는 것입니다. 분명히 이전 의견에서 볼 수 있듯이 URLConnection을 사용할 수도 있습니다. 나는 이것이 대답을 조금 향상시킬 수 있다고 생각했습니다. 어쨌든 HttpURLConnection c = new URL("http://www.google.com").openConnection();Java 8 및 이전 버전의 Java에서 HttpURLConnection에 대한 캐스트 가 확실히 필요한 것은 맞습니다 .
jechterhoff

2

HTTP 서버는 오래된 브라우저와 시스템을 거부하는 경향이 있습니다.

페이지 테크 블로그 (WH) : 가장 일반적인 사용자 에이전트 섹션에서 현재 브라우저의 사용자 에이전트 속성을 반영한다 : "당신의 사용자 에이전트" , a의 요청 속성 "사용자 에이전트"로 설정을 적용 할 수있는 java.net.URLConnection나 시스템 속성 "http.agent".

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.