2011-10-04 2 views
17

: 그러나 conn.setRequestProperty를 호출java의 HttpUrlConnection 클래스를 사용하여 Host 헤더를 재정의 할 수 있습니까? 나는 자바에서 HTTP 연결을 열려면 다음 코드를 사용하고

URL url = new URL("http://stackoverflow.com"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setRequestMethod("GET"); 
conn.setRequestProperty("Host", "Test:8080"); 
conn.getOutputStream(); 

("호스트", "시험 : 8080")에 관계없이 어떤 순서의 영향이없는 것으로 나타납니다 I 메서드를 호출하면 호스트가 대상 서버로 다시 설정됩니다. 다른 라이브러리를 사용하지 않고 호스트 헤더를 무시할 수있는 방법이 있습니까?

TIA 매트

답변

6

Host 헤더는 URL에 기초 HttpURLConnection 의해 채워진다. Host=bar.com과 함께 foo.com을 열 수 없습니다. RFC

에서 호스트 요청 헤더 필드 (일반적으로 HTTP의 URL)

사용자 또는 참조 리소스 주어진 원래 URI로부터 얻어지는 리소스의 인터넷 호스트 및 포트 번호, 요청되는 지정

Btw, apache http components도 시도 할 수 있습니다.

+1

감사의 ChunkStreamMode와 HttpURLConnection의를 반환하는 "HurlStack"클래스를 확장하고 "createConnection"기능을 무시하는 것입니다 하지만 필자는 목적지 서버가 포트 매핑을 예상 할 때 호스트 헤더의 포트를 수정해야하는 역방향 프록시를 구현하려고 할 때 그다지 도움이되지 않습니다. – Matt

+0

아파치 http 컴포넌트를 사용해 볼 수 있습니다 – Bozho

+0

감사합니다. 그래도 더 많은 일이 있습니다. – Matt

25

이전에는 작동했지만 이전에는 보안 수정의 일부로 비활성화되었습니다. 분명히 변경 기록에 메모가 없습니다. bugs.sun.com에는 #7022056 같은 버그도 있습니다.

다른 헤더에 대한 대답은 similar question입니다. 여기에 대한 답변이 세부 정보로 이동하므로 직접 작성하는 대신 링크 만 있습니다. :-)

유일한 해결 방법은 sun.net.http.allowRestrictedHeaderstrue으로 설정하거나 이미 언급 한 http components과 같은 다른 http 라이브러리를 사용하는 것입니다.

+6

고마워,'System.setProperty ("sun.net.http.allowRestrictedHeaders", "true")'훌륭한 작품. –

+0

아, 그냥 디버깅하고 답변을 검색하는 데 몇 시간을 보냈습니다! 많은 감사합니다. – XXL

0

이것은 발리가 HTTPUrlConnection을 처리하고 정책을 다시 시도하는 방법에 대한 문제입니다.

그것에 대한 빠른 수정은 잘 준수 RFC 수 있으며, 0

public class CustomHurlStack extends HurlStack { 


    public CustomHurlStack(){ 
     super(); 

    } 

    @Override 
    protected HttpURLConnection createConnection(URL url) throws IOException { 
     HttpURLConnection connection = super.createConnection(url); 
     connection.setChunkedStreamingMode(0); 
     return connection; 
    } 

}