2011-07-26 2 views
2

프록시 인증이 통합 된 Microsoft ISA Server 뒤에 애플릿이 있습니다. 프록시 서버는 인증 자격 증명이없는 연결에 대해 http 405 (NOT 407)를 반환합니다. 내 java.net.Authenticator 클래스가 호출되지 않습니다. 이 상황에서 어떻게 프록시 서버에 대한 연결을 인증 할 수 있습니까?

애플릿은 java1.6으로 서명되고 컴파일됩니다. URLConnection 클래스가 연결에 사용됩니다.인증이 필요하지만 반환하지 않는 프록시 뒤에 http 연결을 개방하는 경우

+0

HttpURLConnection에 직접 액세스 할 수 있습니까? 아니면 다른 라이브러리를 통해서입니까? – laz

+0

@ laz : 예. 접근 할 수 있습니다. 접근 방식 1의 – e13420xx

답변

2

이 문제를 해결하기위한 두 가지 접근법을 볼 수 있으며 둘 다 실제로 이상적이지 않습니다. 먼저 승인 정보가 포함 된 요청을 보내면 응답 코드가 405이 아니란 사실을 확인한 것 같습니다. 대답은 '예, 당신은 헤더와 같은 요청에 Proxy-authorization 헤더 설정을 시도 할 수 있습니다 :

URL url = new URL("http://location"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("Proxy-authorization", authorizationValue); 

해당 헤더의 형식은 프록시 서버에서 요구하는 인증 방식에 따라 달라집니다, 그래서 당신은거야 특정 시나리오에 대한 조사를해야합니다.

두 번째 방법은 내부 JDK 클래스를 서브 클래스로 만들어 응답 코드를 스푸핑하여 일반 프록시 인증 경로를 강제 적용하는 것입니다. 이 의도하지 않은 결과를 가져올 수 있도록

public class HttpURLConnection extends sun.net.www.protocol.http.HttpURLConnection { 

    @Override 
    public int getResponseCode() throws IOException { 
     int code = super.getResponseCode(); 
     if (code == HTTP_BAD_METHOD) { 
      code = HTTP_PROXY_AUTH; 
      responseCode = code; 
     } 
     return code; 
    } 

} 

는 물론, 이것은 실제 405 응답을 마스크합니다 : 첫째, 여기에 서브 클래스입니다. 의 URL 객체를 말하는 것은이 java.net.URLStreamHandlerFactory의 서브 클래스를 필요로 사용 :

public class URLStreamHandlerFactory extends java.net.URLStreamHandlerFactory { 
    @Override 
    URLStreamHandler createURLStreamHandler(String protocol) { 
     if (!protocol.equals("http")) { 
      return null; 
     } else { 
      return new java.net.URLStreamHandler { 
       protected String proxy; 
       protected int proxyPort; 

       public Handler() { 
        proxy = null; 
        proxyPort = -1; 
       } 

       public Handler (String proxy, int port) { 
        this.proxy = proxy; 
        this.proxyPort = port; 
       } 

       @Override 
       protected java.net.URLConnection openConnection(URL u) throws IOException { 
         return openConnection(u, (Proxy)null); 
       } 

       @Override 
       protected java.net.URLConnection openConnection(URL u, Proxy p) throws IOException { 
         return new HttpURLConnection(u, p, this); 
       } 

       @Override 
       protected int getDefaultPort() { 
        return 80; 
       } 

      } 
     } 
    } 
} 

는 그런 다음 초기화 코드 어딘가에 URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory());를 호출하여이 객체를 사용할 수 있습니다. this sitethis site은 핵심 Java 클래스 작동 방식을 찾는 데 유용합니다. HTTPS를 지원해야하는 경우 해당 프로토콜에 대해 유사한 변경을 수행해야합니다.

이러한 솔루션 중 하나가 유용 할 수 있기를 바랍니다. 후자의 접근 방식이 애플릿의 보안 제약 조건 내에서 작동하는지 완전히 확신 할 수는 없습니다. 전자는 그래야한다. Apache HttpComponents과 같은 다른 HTTP 라이브러리로 사용하는 것이 더 쉬울 수도 있습니다.

+0

헤더는 프록시 승인인가? 또는 프록시 인증 헤더?. 인증 프로토콜은 시간이 (ntlm 또는 kerberos) 시간이 다르기 때문에이 접근법은 매우 힘들 것 같아요? 접근법 2에서 : 응답 코드를 설정하는 것으로 충분하다고 생각합니까? 나는 또한 어떤 종류의 인증이 필요한지에 대한 헤더를 설정할 필요가 있다고 생각한다. – e13420xx

+0

Aproach는 프록시 인증입니다. 계획이 바뀌면 극도로 어려울 것 같습니다. 따라서 '405'를 반환하지만 어떤 유형의 인증이 필요하지 않습니까? 이 경우 네, 필요한 모든'Proxy-Authenticate' 응답 헤더도 포함시켜야합니다. 프록시 서버가 잘못 구성 되었습니까? 이것은 심각하게 깨진 행동처럼 들립니다! 서버가 브라우저와 같이 올바르게 작동합니까? – laz

+0

나는 왜 그런 식으로 구성했는지 알지 못한다. 해당 네트워크의 클라이언트는 주로 로컬로 탐색하는 웹에 대한 액세스가 매우 제한적입니다. 명백히 클라이언트 측에서 해결할 수있는 문제로 인해 변경 될 수는 없습니다. – e13420xx

관련 문제