2009-07-09 15 views
8

Farklı sunucular ve yapılandırmalarla çalışıyorum. Şema almak için en iyi java kodu yaklaşımı nedir: // host: [port 80 değilse port].Java: Sunucunun, şemanın, muhtemelen servlet isteğindeki dize temsili gösterimi

Kullandığım bazı kodlar, ancak bunun en iyi yaklaşım olup olmadığını bilmiyorum.

HttpServletRequest == istek (bu sözde kodudur)

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

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

Böyle val döndüren:

http(s)://server.com/ 

veya

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

, ben sorguya ama her şeye ihtiyacımız dize ve 'bağlam'.

Ben de URL'yi kullanmayı düşünün edildi:

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 çok benzer bir soru gibi görünüyor. – aem

+0

Bu oldukça genel bir soru ve apache lib'lerini kullanamıyorum. –

cevap

16

bu deneyin

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

Bağlantı noktası 80 bağlantı noktasıysa, URL dizesi temsilcisi şunları içerir: 80 metin? –

+0

evet, varsayılan şema bağlantı noktasını kullanmak için -1'i geçebilirsin – dfa

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

çerez belirtildiği gibi, java.net.URI dan (docs). http ve https üzerinde

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

DÜZENLEME

gizleme varsayılan bağlantı noktası:

+0

Doğru geliyor. Bu işlevleri “istek” nesnesini kullanarak kullanabilirim. –

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

Eğer URL'yi istekte göründüğü gibi korumak (ör. Açıkça verilmediyse limanı terketmek), bunun gibi bir şeyi kullanabilirsiniz. Regex, HTTP ve HTTPS URL'leriyle eşleşir. Yakalama grubu 1, şemadan isteğe bağlı bağlantı noktasına kadar sunucu kökünü içerir. (İstediğiniz budur.) Grup 2 sadece ana bilgisayar adını içerir.

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

Burada eksi koyduğum için buraya yazdım regexp – msangel