2009-07-09 17 views
8

Tôi làm việc với các máy chủ và cấu hình khác nhau. Cách tiếp cận java code tốt nhất để lấy lược đồ là gì: // host: [port nếu nó không phải là cổng 80].Java: Biểu diễn chuỗi chỉ là máy chủ, sơ đồ, có thể là cổng từ yêu cầu servlet

Đây là một số mã tôi đã sử dụng, nhưng không biết đây có phải là cách tiếp cận tốt nhất hay không. (đây là mã giả)

HttpServletRequest == yêu cầu

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

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

như vậy mà val trả:

http(s)://server.com/ 

hoặc

http(s)://server.com:7770 

Về cơ bản, tôi cần tất cả mọi thứ nhưng truy vấn chuỗi và 'bối cảnh'.

Tôi cũng đã được xem xét sử dụng 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 có vẻ là một câu hỏi rất giống nhau. – aem

+0

Đó là câu hỏi khá chung chung và tôi không thể sử dụng các apache libs. –

Trả lời

16

thử điều này:

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

EDIT cổng mặc định

ẩn trên httphttps:

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

Nếu cổng là cổng 80, đại diện chuỗi URL có chứa: 80 văn bản không? –

+0

có, bạn có thể vượt qua -1 để sử dụng cổng lược đồ mặc định – dfa

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

Như Cookie cho biết, từ java.net.URI (docs).

+0

Nghe đúng. Tôi có thể sử dụng các chức năng đó với đối tượng yêu cầu của servlet. –

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

Nếu bạn muốn giữ lại URL như được xuất hiện trong yêu cầu (ví dụ: rời khỏi cổng nếu nó không được đưa ra một cách rõ ràng), bạn có thể sử dụng một cái gì đó như thế này. Regex khớp với URL HTTP và HTTPS. Capture nhóm 1 chứa gốc máy chủ từ sơ đồ đến cổng tùy chọn. (Đó là cái bạn muốn.) Nhóm 2 chỉ chứa tên máy chủ.

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

Tôi đặt trừ chỉ vì thấy ở đây regexp – msangel

Các vấn đề liên quan