2009-07-09 2 views
8

다른 서버 및 구성으로 작업합니다. scheme : // host : [port 80이 아닌 경우 port]를 가져 오는 가장 좋은 Java 코드 접근법은 무엇입니까?자바 : 서블릿 요청의 호스트, 스키마, 가능하면 포트의 문자열 표현

여기 제가 사용한 몇 가지 코드가 있지만 이것이 최선의 방법인지는 잘 모릅니다. 는

HttpServletRequest의 == 요청 (이것은 의사 코드)

String serverName = request.getServerName().toLowerCase(); 
String scheme = request.getScheme(); 
int port = request.getServerPort(); 

String val = scheme + "://" + serverName + ":" port; 

이러한 발은 반환 :

http(s)://server.com/ 

또는

기본적으로
http(s)://server.com:7770 

, 나는 쿼리를 제외한 모든 필요 문자열과 '문맥'.

또한 URL을 사용하는 것을 고려했다 :

String absURL = request.getRequestURL(); 
URL url = new URL(absURL); 

url.get???? 
+0

http://stackoverflow.com/questions/883136/is-there-a-good-url-builder-for-java는 매우 유사한 질문입니다. – aem

+0

꽤 일반적인 질문이며 아파치 라이브러리를 사용할 수 없습니다. –

답변

16

이 시도

int port = request.getServerPort(); 

if (request.getScheme().equals("http") && port == 80) { 
    port = -1; 
} else if (request.getScheme().equals("https") && port == 443) { 
    port = -1; 
} 

URL serverURL = new URL(request.getScheme(), request.getServerName(), port, ""); 
+0

포트가 포트 80 인 경우 URL 문자열 담당자가 다음을 포함합니까? 80 텍스트? –

+0

예, 기본 구성표 포트를 사용하기 위해 -1을 전달할 수 있습니다 – dfa

2
URI u=new URI("http://www.google.com/"); 
String s=u.getScheme()+"://"+u.getHost()+":"+u.getPort(); 

쿠키가 말한대로 java.net.URI (docs)입니다. HTTPHTTPS

URL serverURL = new URL(request.getScheme(),  // http 
         request.getServerName(), // host 
         request.getServerPort(), // port 
         "");      // file 

편집

숨어있는 기본 포트 :

+0

소리가 맞습니다. 서블릿 '요청'객체와 함께 이러한 함수를 사용할 수 있습니다. –

1
public String getServer(HttpServletRequest request) { 
    int port = request.getServerPort(); 
    StringBuilder result = new StringBuilder(); 
    result.append(request.getScheme()) 
     .append("://") 
     .append(request.getServerName()); 

    if (port != 80) { 
    result.append(':') 
      .append(port); 
    } 

    return result; 
} 
0

당신이 만약 요청에 나타난대로 URL을 보존하려고합니다 (예 : 포트가 명시 적으로 지정되지 않은 경우 포트에서 나가는 경우) 이와 같이 사용할 수 있습니다. 정규 표현식은 HTTP 및 HTTPS URL을 일치시킵니다. Capture 그룹 1에는 구성표에서 선택적 포트에 대한 서버 루트가 들어 있습니다. 그룹 2는 호스트 이름 만 포함합니다.

String regex = "(^http[s]?://([\\w\\-_]+(?:\\.[\\w\\-_]+)*)(?:\\:[\\d]+)?).*$"; 
Matcher urlMatcher = Pattern.compile(regex).matcher(request.getRequestURL()); 
String serverRoot = urlMatcher.group(1); 
+0

여기에 보았 기 때문에 빼기를 넣었습니다 regexp – msangel