Etki alanı URL'si ve uygulama adı nasıl alınır?


98

İşte senaryo.

Java web uygulamamın aşağıdaki yolu var

https://www.mywebsite.com:9443/MyWebApp

Diyelim ki bir JSP dosyası var

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

ve geri almam gerek

https://www.mywebsite.com:9443/MyWebApp 

bu JSP dosyasında.

Elbette, sadece URL'yi almanın ve ardından geriye giden yolu yeniden izlemenin oldukça tembel ve aptalca bir yolu var.

Ancak bunu yapmanın programlı bir yolu var mı? Özellikle, etki alanı + bağlantı noktasını alabileceğimi düşünüyorum, ancak "MyWebApp" uygulama adını gerçekten nasıl alabilirim?

Yanıtlar:


91

Web uygulaması adı (aslında bağlam yolu) çağrı yapılarak kullanılabilir HttpServletrequest#getContextPath()(ve bu nedenle daha getServletPath()önce önerildiği gibi DEĞİL ). Bunu JSP'de ile geri alabilirsiniz ${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p>

Bunu JSP sayfanızdaki tüm göreceli yollar için kullanmayı düşünüyorsanız (bu, bu soruyu daha anlamlı hale getirir), o zaman HTML <base>etiketini kullanabilirsiniz:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2204870</title>
        <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
        <script src="js/global.js"></script>
        <link rel="stylesheet" href="css/global.css">
    </head>
    <body>
        <ul>
            <li><a href="home.jsp">Home</a></li>
            <li><a href="faq.jsp">FAQ</a></li>
            <li><a href="contact.jsp">Contact</a></li>
        </ul>
    </body>
</html>

Sayfadaki tüm bağlantılar daha sonra otomatik olarak göreli olacaktır, <base>böylece bağlam yolunu her yere kopyalamanıza gerek kalmaz. Göreli bağlantılar a ile başladığında /, <base>artık bunların artık göreceli olmayacaklarını, bunun yerine alan köküne göre olacaklarını unutmayın .


Doc, "tarafından döndürülen ServletContext.getContextPath() bağlam yolu, uygulamanın birincil veya tercih edilen bağlam yolu olarak düşünülmelidir " der . Bunu anladıktan sonra orijinal cevabıma dahil etmemin sebebi buydu. OP'nin dokümanları okumayı düşünmesini ve ilgili yöntemler hakkında biraz daha fazla bilgi sahibi olmasını istediğim için ilk denememi kaldırmadım. Umarım benim fikrimi anlıyorsundur.
Adeel Ansari

@ Sirke: JSP dosyaları için getServletPath()döner /filename.jsp. OP bunu hiç istemiyordu, kesinlikle yapılacak yol bu değil.
BalusC

Yazımda kesinlikle düzeltme yapardım ama bu sefer tamamen farklı olan yorumuma yanıt bekliyordum :).
Adeel Ansari

2
XHTML DOCTYPE'ta, contextPath'e bir '/' karakteri eklemeniz gerekecektir. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa

<base>Etiketi neden kapatmadınız ? Tüm etiketlerin kapatılması gerekmez mi?
Fabiano Francesconi

107

İçin belgelere bir göz atın HttpServletRequest.
Örneğinizdeki URL'yi oluşturmak için kullanmanız gerekecek:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

İşte örneğinizi döndürecek bir yöntem:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

1
sunucu adı localhost ise ip nasıl alınır?
Mahmoud Saleh

hızlı bir şekilde not edin, getScheme () her zaman https için çalışmaz, bazı sunucular tuhaf davranışlara sahiptir ve her zaman https yerine http döndürebilir. Sana haber vermem gerektiğini düşündüm. deneyin request.getRequestURL (). toString () ve gerekirse masaj yapın
K ''

1
@MahmoudSalehrequest.getLocalAddr()
mavimsi

Yöntemlerin her biri için örnek çıktıyı da gösterirseniz iyi olur. Sadece her birinin çıktısının ne olabileceğini kontrol etmek için bir web sunucusunu kurup çalıştırmak acı veriyor.
Jus12

1
getContextPath()yöntemde hiçbir şey döndürmez! Ve getServerPort()sadece 2 basamaklı bir sayı döndürür, 4 basamaklı bir sayı değil! Bu konuda biraz yardım alabilir miyim?
sam

23

Uygulama adı nereden geliyor getContextPath.

Bu grafiği Agile Software Craftsmanship'ten buluyorum HttpServletRequest Path Decoding , mevcut olan tüm farklı yöntemleri sıralıyor :

görüntü açıklamasını buraya girin


1
Bu grafik, birçok soruyu yanıtlamak için kullanışlıdır. Bunu birçok sorunun cevabında kullanmayı denedim, ancak hepsi silindi: aynı cevabın yeniden kullanılmasına karşı bir kural var. Bu utanç verici. Teori, aynı cevabı kullanırsanız, soruların aynı olması gerektiği ve bu nedenle soruyu sadece kopya olarak işaretlemeniz gerektiğidir. Ama bu gerçek değil. Aynı grafikle cevaplanabilecek birçok farklı soru var. Bu tür keyfi kuralları uygulamak küçük fikirlidir. Bu grafikle en iyi yanıtlanan bir soru görürseniz, lütfen onu kullanın.
AgilePro


4

Aşağıdaki kod, JavaScript kullanan web uygulaması için yararlı olabilir.

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));

0

Dize olarak bir url geçiriyorsanız ve bu uygulamanın bağlam kökünü çıkarmak istiyorsanız, bu regex'i ayıklamak için kullanabilirsiniz. Bağlam kökü ile başlayan tam url'ler veya göreli url'ler için çalışacaktır.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.