Quel est le meilleur moyen d'obtenir l'URL racine/base d'une application Web dans Spring MVC?
URL de base = http://www.example.com ou http://www.example.com/VirtualDirectory
Si l'URL de base est " http://www.example.com ", utilisez ce qui suit pour obtenir la partie "www.example.com", sans "http: //" :
Depuis un contrôleur:
@RequestMapping(value = "/someURL", method = RequestMethod.GET)
public ModelAndView doSomething(HttpServletRequest request) throws IOException{
//Try this:
request.getLocalName();
// or this
request.getLocalAddr();
}
De JSP:
Déclarez ceci sur votre document:
<c:set var="baseURL" value="${pageContext.request.localName}"/> //or ".localAddr"
Ensuite, pour l'utiliser, référencez la variable:
<a href="http://${baseURL}">Go Home</a>
Vous pouvez également créer votre propre méthode pour l'obtenir:
public String getURLBase(HttpServletRequest request) throws MalformedURLException {
URL requestURL = new URL(request.getRequestURL().toString());
String port = requestURL.getPort() == -1 ? "" : ":" + requestURL.getPort();
return requestURL.getProtocol() + "://" + requestURL.getHost() + port;
}
request.getRequestURL (). toString (). replace (request.getRequestURI (), request.getContextPath ())
Dans le contrôleur, utilisez HttpServletRequest.getContextPath()
.
Dans JSP, utilisez la bibliothèque de balises de Spring: ou jstl
Simplement:
String getBaseUrl(HttpServletRequest req) {
return req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath();
}
Soit injecter une UriCompoenentsBuilder
:
@RequestMapping(yaddie yadda)
public void doit(UriComponentBuilder b) {
//b is pre-populated with context URI here
}
. Ou faites-le vous-même (semblable à la réponse Salims):
// Get full URL (http://user:[email protected]/root/some?k=v#hey)
URI requestUri = new URI(req.getRequestURL().toString());
// and strip last parts (http://user:[email protected]/root)
URI contextUri = new URI(requestUri.getScheme(),
requestUri.getAuthority(),
req.getContextPath(),
null,
null);
Vous pouvez ensuite utiliser UriComponentsBuilder à partir de cet URI:
// http://user:[email protected]/root/some/other/14
URI complete = UriComponentsBuilder.fromUri(contextUri)
.path("/some/other/{id}")
.buildAndExpand(14)
.toUri();
@RequestMapping(value="/myMapping",method = RequestMethod.POST)
public ModelandView myAction(HttpServletRequest request){
//then follow this answer to get your Root url
}
Si vous en avez besoin dans jsp, accédez au contrôleur et ajoutez-le en tant qu’objet dans ModelAndView.
Sinon, si vous en avez besoin côté client, utilisez javascript pour le récupérer: http://www.gotknowhow.com/articles/how-to-get-the-base-url-with-javascript
Je préfère utiliser
final String baseUrl =
ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
Il renvoie une URL, un schéma, un nom de serveur et un port de serveur entièrement construits, plutôt que de concaténer et de remplacer des chaînes qui sont sujettes aux erreurs.
Dans JSP
<c:set var="scheme" value="${pageContext.request.scheme}"/>
<c:set var="serverPort" value="${pageContext.request.serverPort}"/>
<c:set var="port" value=":${serverPort}"/>
<a href="${scheme}://${pageContext.request.serverName}${port}">base url</a>
Je pense que la réponse à cette question est: La recherche de l'URL de votre application avec uniquement un ServletContext montre pourquoi vous devez utiliser des URL relatives à la place, à moins que vous n'ayez une raison très précise de vouloir utiliser l'URL racine.