47

在 Spring MVC 中获取 Web 应用程序的根/基本 url 的最佳方法是什么?

基本网址 = http://www.example.comhttp://www.example.com/VirtualDirectory

4

13 回答 13

58

我更喜欢使用

final String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();

它返回一个完全构建的 URL、方案、服务器名称和服务器端口,而不是连接和替换容易出错的字符串。

于 2018-12-22T15:31:05.527 回答
29

如果基本 url 是“ http://www.example.com ”,则使用以下内容获取“ www.example.com ”部分,不包含“http://”:

从控制器:

@RequestMapping(value = "/someURL", method = RequestMethod.GET)
public ModelAndView doSomething(HttpServletRequest request) throws IOException{
    //Try this:
    request.getLocalName(); 
    // or this
    request.getLocalAddr();
}

来自 JSP:

在文档顶部声明:

<c:set var="baseURL" value="${pageContext.request.localName}"/> //or ".localAddr"

然后,要使用它,请引用变量:

<a href="http://${baseURL}">Go Home</a>
于 2013-03-30T13:01:50.973 回答
18

您还可以创建自己的方法来获取它:

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;

}
于 2016-03-14T02:45:52.047 回答
14

解释

我知道这个问题已经很老了,但这是我发现的关于这个主题的唯一一个,所以我想为未来的访问者分享我的方法。

如果要从 WebRequest 获取基本 URL,可以执行以下操作:

ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request);

这将为您提供方案(“http”或“https”)、主机(“example.com”)、端口(“8080”)和路径(“/some/path”),同时fromRequest(request)为您提供查询参数也是。但由于我们只想获取基本 URL(方案、主机、端口),我们不需要查询参数。

现在您可以使用以下行删除路径:

ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null);

TLDR

最后,我们获取基本 URL 的单行代码如下所示:

//request URL: "http://example.com:8080/some/path?someParam=42"

String baseUrl = ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request)
        .replacePath(null)
        .build()
        .toUriString();

//baseUrl: "http://example.com:8080"

添加

如果你想在控制器之外或没有HttpServletRequest礼物的地方使用它,你可以替换

ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null)

ServletUriComponentsBuilder.fromCurrentContextPath()

这将获得HttpServletRequest通过弹簧的RequestContextHolder。您也不需要,replacePath(null)因为它已经只有方案、主机和端口。

于 2019-09-05T07:56:14.993 回答
11

request.getRequestURL().toString().replace(request.getRequestURI(), request.getContextPath())

于 2015-03-04T10:17:47.947 回答
10

简单地 :

/*
 * Returns the base URL from a request.
 *
 * @example: http://myhost:80/myapp
 * @example: https://mysecuredhost:443/
 */
String getBaseUrl(HttpServletRequest req) {
  return ""
    + req.getScheme() + "://"
    + req.getServerName()
    + ":" + req.getServerPort()
    + req.getContextPath();
}
于 2017-07-27T00:04:42.810 回答
9

在控制器中,使用HttpServletRequest.getContextPath().

在 JSP 中使用 Spring 的标签库:或 jstl

于 2012-10-26T16:43:55.303 回答
7

要么注入UriCompoenentsBuilder

@RequestMapping(yaddie yadda)
public void doit(UriComponentBuilder b) {
  //b is pre-populated with context URI here
}

. 或者自己制作(类似于 Salims 的回答):

// Get full URL (http://user:pwd@www.example.com/root/some?k=v#hey)
URI requestUri = new URI(req.getRequestURL().toString());
// and strip last parts (http://user:pwd@www.example.com/root)
URI contextUri = new URI(requestUri.getScheme(), 
                         requestUri.getAuthority(), 
                         req.getContextPath(), 
                         null, 
                         null);

然后,您可以使用该 URI 中的 UriComponentsBuilder:

// http://user:pwd@www.example.com/root/some/other/14
URI complete = UriComponentsBuilder.fromUri(contextUri)
                                   .path("/some/other/{id}")
                                   .buildAndExpand(14)
                                   .toUri();
于 2015-12-07T13:00:06.580 回答
2

在 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>

参考https://github.com/spring-projects/greenhouse/blob/master/src/main/webapp/WEB-INF/tags/urls/absoluteUrl.tag

于 2016-12-11T05:54:36.007 回答
1
     @RequestMapping(value="/myMapping",method = RequestMethod.POST)
      public ModelandView myAction(HttpServletRequest request){

       //then follow this answer to get your Root url
     }

servlet 的根 URL

如果您在 jsp 中需要它,则进入控制器并将其作为对象添加到 ModelAndView 中。

或者,如果您在客户端需要它,请使用 javascript 检索它: http ://www.gotknowhow.com/articles/how-to-get-the-base-url-with-javascript

于 2011-02-16T10:22:32.357 回答
0

我认为这个问题的答案:仅使用 ServletContext 查找应用程序的 URL说明了为什么应该使用相对 url,除非您有非常具体的原因需要根 url。

于 2011-09-21T12:37:11.043 回答
0

如果您只是对浏览器中 url 的主机部分感兴趣,那么直接从request.getHeader("host")) -

import javax.servlet.http.HttpServletRequest;

@GetMapping("/host")
public String getHostName(HttpServletRequest request) {

     request.getLocalName() ; // it will return the hostname of the machine where server is running.

     request.getLocalName() ; // it will return the ip address of the machine where server is running.


    return request.getHeader("host"));

}

如果请求 url 是https://localhost:8082/host

本地主机:8082

于 2020-04-01T10:39:16.700 回答
0

这里:

在 [body 标签] 内的 .jsp 文件中

<input type="hidden" id="baseurl" name="baseurl" value=" " />

在您的 .js 文件中

var baseUrl = windowurl.split('://')[1].split('/')[0]; //as to split function 
var xhr = new XMLHttpRequest();
var url='http://'+baseUrl+'/your url in your controller';
xhr.open("POST", url); //using "POST" request coz that's what i was tryna do
xhr.send(); //object use to send```
于 2020-12-16T12:26:40.877 回答