web-dev-qa-db-fra.com

obtenir l'URL vers un contexte webapp (l'URL de base)

Parfois, vous devez créer une URL complète vers le contexte de votre application Web dans un servlet/JSP/quoi que ce soit basé sur HttpServletRequest. Quelque chose comme http://server.name:8080/context/. L'API Servlet n'a pas une seule méthode pour y parvenir.

L'approche simple consiste à ajouter tous les composants d'URL à un StringBuffer, comme

ctxUrl = sb.append(req.getScheme()).append("://")
.append(req.getgetServerName()).append(":")
.append(req.getServerPort()) etc

Je me demande s'il y a quelque chose de mal avec cette alternative (qui est 10 fois plus rapide):

ctxUrl = req.getRequestURL();
ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));

Les deux méthodes ci-dessus produiront-elles toujours le même résultat?

19
Oleg Mikheev

Cela s'appelle "l'URL de base" (celle que vous pouvez utiliser dans la balise HTML <base>). Vous pouvez l'obtenir comme suit:

StringBuffer url = req.getRequestURL();
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String base = url.substring(0, url.length() - uri.length() + ctx.length()) + "/";

Votre approche ctxUrl.substring(0, ctxUrl.lastIndexOf("/"))); échouera sur les URL avec plusieurs dossiers comme http://server.name:8080/context/folder1/folder2/folder3.

Voir également:

25
BalusC

Ce qui suit obtiendra l'URL de contexte et résoudra les choses de manière appropriée.

URI contextUrl = URI.create(req.getRequestURL().toString()).resolve(req.getContextPath());

Cela fera tout le traitement nécessaire pour les ports, les barres obliques et autres. Cela fonctionnera également pour le contexte racine car req.getContextPath () renverra ""

Si vous utilisez un serveur proxy, vous devez vous assurer que l'original Host: la demande est passée (par exemple instructions Apache ProxyPass à ProxyPreserveHost .

17
Archimedes Trajano

Supposer,

Nous voulons obtenir http://server.name:8080/context/ de n'importe où dans Java projet d'application web.

String uri = request.getRequestURI();
//uri = "/context/someAction"
String url = request.getRequestURL().toString();
// url = "http://server.name:8080/context/someAction"
String ctxPath = request.getContextPath();
// ctxPath = "/context";
url = url.replaceFirst(uri, "");
// url = "http://server.name:8080"
url = url + ctxPath;
//url = "http://server.name:8080/context"

en utilisant ce bloc de code, nous pouvons obtenir l'URL

1
mhmuftee