Como obter o URL do domínio e o nome do aplicativo?

98

Aqui está o cenário.

Meu aplicativo da web Java tem o seguinte caminho

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

Digamos que haja um arquivo JSP

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

e eu preciso recuperar

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

dentro deste arquivo JSP.

Claro, existe uma maneira preguiçosa e boba de apenas obter a URL e, em seguida, rastrear novamente o caminho de volta.

Mas existe uma maneira programática de fazer isso? Especificamente, acho que posso obter o domínio + porta, mas como realmente recupero o nome do aplicativo "MyWebApp"?

Ericbae
fonte

Respostas:

91

O nome do aplicativo da web (na verdade, o caminho do contexto) está disponível chamando HttpServletrequest#getContextPath()(e, portanto, NÃO getServletPath()como sugerido antes). Você pode recuperar isso em JSP por ${pageContext.request.contextPath}.

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

Se você pretende usar isso para todos os caminhos relativos em sua página JSP (o que faria essa pergunta mais sentido), você pode usar a <base>tag HTML :

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

Todos os links na página serão, então, automagicamente relativos ao <base>para que você não precise copiar e colar o caminho do contexto em todos os lugares. Observe que quando os links relativos começam com a /, eles não serão mais relativos a <base>, mas sim à raiz do domínio.

BalusC
fonte
Doc afirma: "O caminho de contexto retornado por ServletContext.getContextPath() deve ser considerado o caminho de contexto principal ou preferido do aplicativo". Essa foi a razão pela qual incluí esta em minha resposta original, depois de perceber a coisa. Não retirei minha primeira tentativa, pois quero que o OP considere a leitura dos documentos e saiba um pouco mais sobre os métodos relacionados. Espero que você esteja entendendo meu ponto.
Adeel Ansari
@Vinegar: Para arquivos JSP, os getServletPath()retornos /filename.jsp. O OP não estava pedindo isso, certamente não é o caminho a seguir.
BalusC
Certamente faria uma correção no meu post, mas desta vez esperava uma resposta ao meu comentário, que é totalmente diferente :).
Adeel Ansari
2
Em XHTML DOCTYPE, você precisará anexar um caractere '/' ao contextPath. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa
Por que você não fechou a <base>tag? Todas as tags não deveriam ser fechadas?
Fabiano Francesconi
106

Dê uma olhada na documentação do HttpServletRequest.
Para construir o URL em seu exemplo, você precisará usar:

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

Aqui está um método que retornará seu exemplo:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Jataro
fonte
1
como pegar o ip caso o servername fosse localhost?
Mahmoud Saleh
apenas uma observação rápida, getScheme () nem sempre funciona para https, alguns servidores têm um comportamento estranho e podem sempre retornar http em vez de https. Achei que deveria deixar você saber. tente request.getRequestURL (). toString () e massageie se precisar
K ''
1
@MahmoudSalehrequest.getLocalAddr()
azulado
Será bom se você também mostrar a saída de exemplo para cada um dos métodos. É uma pena colocar um servidor da Web em funcionamento apenas para verificar qual pode ser o resultado de cada um.
Jus12
1
getContextPath()no método não retorna nada! E getServerPort()retorna apenas um número de 2 dígitos, não um número de 4 dígitos! Posso ajudar com isso?
sam
22

O nome do aplicativo vem getContextPath.

Acho que este gráfico do Agile Software Craftsmanship HttpServletRequest Path Decoding classifica todos os diferentes métodos que estão disponíveis:

insira a descrição da imagem aqui

AgilePro
fonte
1
Este gráfico é útil para responder a muitas perguntas. Tentei usá-lo na resposta a muitas perguntas, mas todas foram excluídas: há uma regra contra a reutilização da mesma resposta. O que é uma pena. A teoria é que se você usar a mesma resposta, as perguntas devem ser as mesmas e, portanto, você deve apenas marcar a pergunta como duplicada. Mas isso não é realidade. Existem muitas perguntas diferentes que podem ser respondidas com o mesmo gráfico. É mesquinho implementar tais regras arbitrárias. Se VOCÊ vir uma pergunta que é melhor respondida com este gráfico, use-o.
AgilePro
7

Eu sugiro fortemente que você leia os documentos , para métodos semelhantes. Se você estiver interessado no caminho do contexto, dê uma olhada aqui, ServletContext.getContextPath () .

Adeel Ansari
fonte
4

O código a seguir pode ser útil para aplicativos da web que usam JavaScript.

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

newURL = newURL.substring(0,newURL.indexOf(""));
Muito pequeno
fonte
0

Se você está recebendo um url como String e deseja extrair a raiz de contexto desse aplicativo, pode usar este regex para extraí-lo. Funcionará para urls completos ou urls relativos que começam com a raiz de contexto.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
master_d
fonte