2015-01-17 3 views
2

요청 로깅을 위해 로컬 프록시 서버를 설정했지만 Java 코드가이를 무시하고 직접 연결합니다 (Windows XP, JDK 1.7). 웹 브라우저가 작동합니다. 그래서 (가짜) 프록시가 지정 되더라도 직접 연결하는 것처럼 보이는 토론 용 테스트 코드를 작성했습니다. 가짜 프록시로 직접 연결, 나는 연결 실패를 기대하지만, 코드는 성공 :java가 프록시 설정을 무시합니다.

System.setProperty("http.proxyHost", "localhost"); 
System.setProperty("http.proxyPort", "12345"); 
System.setProperty("http.nonProxyHosts", "noNonProxyHost.com"); 
URL url = new URL("http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html"); 
InputStream in = url.openStream(); 
System.out.println("Connection via bogus proxy succeeded"); 

코드는 독립형 Java, 아니 메이븐, 아니 애플릿, 아니 컨테이너로 실행됩니다. 직접 인터넷에 연결되어 있습니다.

+0

여기의 토론은 관련성이 있습니다. http://java.dzone.com/articles/proxying-request-localhost –

+0

Jeremy 많은 링크에 감사드립니다! 이것은 매우 관련이 있습니다. 시작 등록 정보와 코드에서 빈 http.nonProxyHosts를 사용했지만 Java는 여전히 직접 연결합니다. – user250343

답변

0

java.net.URL()을 사용하는 경우 http.proxyHost 및 http.proxyPort에서 프록시 서버에 연결할 수없는 경우 단순히 폴백하여 직접 연결을 시도합니다. 성공하면 예외없이 코드가 오류없이 작동하는 이유가 표시됩니다. 프록시를 찾으려고 시도하는 동안 일시 중지가 표시되어야합니다.
아래 샘플 코드는 위조 된 프록시 설정으로 실행하는 경우에도 URL을 쉽게 가져 와서 오류없이 표시합니다. -Dhttp.proxyHost = 가짜 -Dhttp.proxyPort = 2345하지만 제대로

 

    import java.io.*; 
    import java.net.URL; 
    import java.util.*; 
    public class URLClient { 
     private static String sUrl = "http://www.apache.org/"; 
     public static void main(String[] args) { 
     try { 
     URL url = new URL(sUrl); 
     InputStream is = url.openStream(); 
     java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
     String output = s.hasNext() ? s.next() : ""; 
     System.out.println(output); 
     } catch(Throwable e) { 
       System.err.println("exception"); 
     } 
     } 
    } 


내가 원래 http.proxyHost를하고 http.proxyPort 함께 가졌다 문제 설정하면 내 로컬 프록시 로컬 호스트 포트 8888에 이야기합니다 무시 (구글 귀하의 질문에) 그 설정은 완전히 여기에 설명 된 바와 같이 자체 소켓을 사용하기 때문에 apache.commons.httpClient에 의해 무시되었습니다. http://cephas.net/blog/2007/11/14/java-commons-http-client-and-http-proxies/

0

나는 최근에 비슷한 문제에 직면했다.

프록시 서버가 http.proxyHost를 도달 할 수없는 경우 : 가짜 프록시 서버 프로그램의 실패로 이어질하지 않은 이유는 첫째, Daemon42에서 위의 대답의 한 부분은 꽤 잘 설명 http.proxyPort를 입력하면 간단히 뒤로 물러나 직접 연결을 시도합니다. 성공하면 예외없이 코드가 오류없이 작동하는 이유가 표시됩니다. 프록시를 찾으려고 시도하는 동안 일시 중지가 표시되어야합니다.

여전히 실제 질문은 운영 체제를 통해 구성된 프록시 서버가 Java 응용 프로그램에서 사용되지 않는 이유입니다. Oracle 설명서 (https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html)에 명시된 바와 같이 시스템 프록시 설정은 기본적으로 Java에 의해 평가되지 않습니다. 이렇게하려면 시스템 등록 정보 "java.net.useSystemProxies"의 값을 "true"값으로 설정해야합니다.

명령 줄에서 해당 시스템 특성을 설정하거나 JRE 설치 파일 jre/lib/net.properties를 편집하여 주어진 시스템에서 한 번만 변경해야합니다.

+0

'System.setProperty ("java.net.useSystemProxies", "true");를 추가하면 불행하게도 효과가없는 것으로 보입니다. – Marc

관련 문제