HttpURLConnection이 프록시를 사용하도록하려면 어떻게합니까?


136

내가 이렇게하면 ...

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

그것은 인쇄

Proxy? false

문제는 프록시 뒤에 있습니다. JVM은 Windows에서 프록시 정보를 어디에서 가져 옵니까? 이것을 어떻게 설정합니까? 다른 모든 앱은 프록시에 완벽하게 만족합니다.

답변:


336

java 1.5부터 java.net.Proxy 인스턴스를 openConnection(proxy)메소드에 전달할 수도 있습니다 .

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

프록시가 인증을 요구하면 응답 407을 제공합니다.

이 경우 다음 코드가 필요합니다.

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);

7
이를 통해 프록시 사용자 이름과 프록시 비밀번호를 제공 할 수 있습니다.
Xolve

15
다른 프록시에 대해 다른 사용자 이름 / 암호 쌍이있는 경우 어떻게합니까? 기본 인증자를 설정하기 위해 정적 메소드를 호출하는 것이 이상적이지 않습니다. 이는 sys 특성 메소드를 설정하는 것보다 낫지 않습니다.
javaPhobic

2
Authenticator.default는 정적 (즉, 전역) 변수이므로 한 번만 가능합니다. 그러나 위의 인증자는 최소한의 예일뿐입니다. 한 번에 하나의 비밀번호 만 처리 할 수 ​​있습니다. Google은 다른 비밀번호로 여러 호스트를 처리 할 수있는 예제를 제공합니다.
Stroboskop

3
8u11부터 기본 인증 인 oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes 시스템 속성은 기본적으로 emtpty로 설정되어 있어야합니다.
백색

3
도메인이있는 경우 로 수행 다음 :new PasswordAuthentication("domainName\\user", "password".toCharArray());
개발자 마리우스 Žilėnas

34

인터넷에서 대답하기가 매우 쉽습니다. 시스템 속성을 설정 http.proxyHost하고 http.proxyPort. 을 사용 System.setProperty()하거나 명령 줄에서 -D구문을 사용 하여이 작업을 수행 할 수 있습니다 .


19

프록시는 http.proxyHost 및 http.proxyPort의 두 가지 시스템 속성을 통해 지원됩니다. 프록시 서버와 포트로 각각 설정해야합니다. 다음은 기본 예입니다.

String url = "http://www.google.com/",
       proxy = "proxy.mydomain.com",
       port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);

@Pascal Apache와 비교하여 최신 Java 접근 방식의 주요 차이점이 무엇인지 아십니까 commons-httpclient? Java가 프록시 및 인증을 지원하므로 (여기서 stackoverflow.com/questions/1626549/… 참조 ), 간단한 경우 (공용 HTTP 서버에서 하나의 파일 검색과 같은) Apache 라이브러리를 사용할 이유가 없습니다. 당신의 추천은 무엇입니까?
dma_k

@dma_k 나는 당신과 동의합니다. 당신이 설명 한 것과 같은 간단한 사용 사례에 대해서는 타사 라이브러리를 사용하지 않을 것입니다.
Pascal Thivent

비 프록시 호스트를 지원하는 방법을 알고 있습니까? 내 장치가 지원하지만 앱에서 처리하는 방법을 모르겠습니다.
RiRomain

그러나 변수 systemPropertiesconnection!
parsecer

12

설정할 수도 있습니다

-Djava.net.useSystemProxies=true

Windows 및 Linux에서는 시스템 설정을 사용하므로 반복 할 필요가 없습니다 (DRY)

http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies


6
수동 프록시 서버 구성에서만 작동합니다. 스크립트를 통해 구성된 자동 프록시 구성 및 프록시는 아직 "useSystemProxies"로 전파되지 않습니다.
타이어

1
proxyHost를 설정하고 proxyPort가 설정하지 않았을 때 도움이되었습니다. 감사!
nrobey

호출 할 때 마찬가지로,이 내 회사 프록시 뒤에서 일 System.setProperty에 대한 https.proxyHosthttps.proxyPort몇 가지 이유가 겨자를 절단되지 않았다.
Pavel Komarov

10

Connection을 열기 전에 다음을 설정하십시오.

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");

프록시에 인증이 필요한 경우

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");

7
실제로 "http.proxyUser"및 "http.proxyPassword"는 더 이상 지원되지 않습니다. 자세한 내용은 stackoverflow.com/questions/120797/… 를 참조하십시오.
p3t0r


2

프록시 호스트와 포트 =)를 알고 있으면 승인 된 답변이 작동합니다. 그러나 프록시 호스트와 포트를 찾고 있다면 아래 단계가 도움이 될 것입니다.

자동 구성된 프록시가 제공된 경우 :

1> 열린 IE (또는 모든 브라우저)

2> IE-> 도구-> 인터넷 옵션-> 연결-> LAN 설정-> 주소 가져 오기를 통해 브라우저에서 URL 주소를 가져 와서 URL 을 입력하십시오 ( 예 : http://autocache.abc.com/ ). 파일은 .pac 형식으로 다운로드되어 바탕 화면에 저장됩니다

3> 텍스트 패드에서 .pac 파일을 열고 PROXY를 식별하십시오.

편집기에서 다음과 같이 나타납니다.

"PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080"을 반환합니다.

5 분 안에 maven에서 bekur로 작동하지 않는 kudos

일단 당신이 호스트와 포트를 가지고 이것과 당신의 좋은에 팝업

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.