도메인 URL과 애플리케이션 이름을 얻는 방법은 무엇입니까?


98

다음은 시나리오입니다.

내 Java 웹 응용 프로그램에는 다음 경로가 있습니다.

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

JSP 파일이 있다고 가정 해 보겠습니다.

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

그리고 나는 검색해야

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

이 JSP 파일 내에서.

물론 URL을 가져온 다음 경로를 다시 추적하는 게으르고 어리석은 방법이 있습니다.

그러나 이것을 수행하는 프로그래밍 방식이 있습니까? 특히 도메인 + 포트를 얻을 수 있다고 생각하지만 실제로 응용 프로그램 이름 "MyWebApp"을 어떻게 검색합니까?

답변:


91

웹 응용 프로그램 이름 (실제로 컨텍스트 경로)은 호출하여 사용할 수 있습니다 HttpServletrequest#getContextPath()(따라서 getServletPath()이전에 제안 된 이름 이 아님 ). JSP에서 ${pageContext.request.contextPath}.

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

JSP 페이지의 모든 상대 경로에 이것을 사용하려는 경우 (이 질문이 더 의미가 있음) HTML <base>태그를 사용할 수 있습니다 .

<%@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>

그러면 페이지의 모든 링크가 자동으로에 상대적 <base>이므로 모든 곳에 컨텍스트 경로를 복사하여 붙여 넣을 필요가 없습니다. 상대 링크가로 시작 /하면 <base>더 이상에 상대적이 아니라 도메인 루트에 상대적이 됩니다.


Doc은 "에서 반환 된 ServletContext.getContextPath() 컨텍스트 경로는 응용 프로그램의 주요 또는 선호 컨텍스트 경로로 간주되어야합니다."라고 말합니다. 그것이 사실을 깨닫고 원래 대답에 이것을 포함시킨 이유였습니다. OP가 문서를 읽는 것을 고려하고 관련 방법에 대해 조금 더 알고 싶기 때문에 첫 번째 시도를 제거하지 않았습니다. 당신이 내 요점을 이해하기를 바랍니다.
Adeel Ansari

@Vinegar : JSP 파일의 내용은 getServletPath()반환 /filename.jsp. OP는 그것을 전혀 요구하지 않았고, 이것은 확실히 갈 길이 아닙니다.
BalusC 2010

나는 확실히 내 게시물을 수정할 것이지만 이번에는 완전히 다른 내 의견에 대한 응답을 기대했습니다. :).
Adeel Ansari

2
XHTML DOCTYPE에서는 '/'문자를 contextPath에 추가해야합니다. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa

<base>태그 를 닫지 않았 습니까? 모든 태그를 닫아야하지 않습니까?
Fabiano Francesconi

106

에 대한 문서를 살펴보십시오 HttpServletRequest.
예제에서 URL을 작성하려면 다음을 사용해야합니다.

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

다음은 예제를 반환하는 메서드입니다.

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

1
서버 이름이 localhost 인 경우 IP를 얻는 방법은 무엇입니까?
Mahmoud Saleh 2011

참고로 getScheme ()이 항상 https에서 작동하는 것은 아니며 일부 서버는 이상한 동작을하며 항상 https 대신 http를 반환 할 수 있습니다. 알려줘야한다고 생각 했어요. . toString을 (request.getRequestURL ()를 시도)와 u는 필요하면 마사지
K ''

1
@MahmoudSalehrequest.getLocalAddr()
푸른 빛이 도는

각 메서드에 대한 예제 출력도 표시하면 좋습니다. 각각의 출력이 무엇인지 확인하기 위해 웹 서버를 가동하고 실행하는 것은 고통입니다.
Jus12

1
getContextPath()메서드에서 아무것도 반환하지 않습니다! 그리고 getServerPort()4 자리 숫자가 아닌 2 자리 숫자 만 반환합니다! 도움을받을 수 있을까요?
sam

22

응용 프로그램 이름은 getContextPath.

Agile Software Craftsmanship HttpServletRequest Path Decoding 에서이 그래픽 은 사용 가능한 모든 다른 방법을 정렬합니다.

여기에 이미지 설명 입력


1
이 그래픽은 많은 질문에 답하는 데 유용합니다. 나는 많은 질문에 대한 대답에 그것을 사용하려고 시도했지만 모두 삭제되었습니다. 같은 대답을 재사용하는 것을 금지하는 규칙이 있습니다. 부끄러운 일입니다. 이론은 동일한 답을 사용하면 질문이 동일해야하므로 질문을 중복으로 표시해야한다는 것입니다. 그러나 그것은 현실이 아닙니다. 동일한 그래픽으로 답변 할 수있는 다양한 질문이 있습니다. 그러한 임의의 규칙을 구현하는 것은 소박합니다. 이 그래픽으로 가장 잘 대답 된 질문을 발견하면이를 사용하십시오.
AgilePro


4

다음 코드는 JavaScript를 사용하는 웹 애플리케이션에 유용 할 수 있습니다.

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

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

0

URL을 문자열로 전달하고 해당 응용 프로그램의 컨텍스트 루트를 추출하려는 경우이 정규식을 사용하여 추출 할 수 있습니다. 컨텍스트 루트로 시작하는 전체 URL 또는 상대 URL에 대해 작동합니다.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.