在Spring MVC中获取Root / Base Url

时间:2011-02-16 04:25:39

标签: spring-mvc base-url

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

Base Url = http://www.example.comhttp://www.example.com/VirtualDirectory

13 个答案:

答案 0 :(得分:24)

如果基本网址为“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>

答案 1 :(得分:12)

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

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;

}

答案 2 :(得分:11)

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

答案 3 :(得分:8)

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

在使用Spring标记库的JSP中:用于jstl

答案 4 :(得分:5)

注入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();

答案 5 :(得分:4)

简单地说:

video {display: block;}

答案 6 :(得分:3)

我更喜欢使用

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

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

答案 7 :(得分:2)

说明

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

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

ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request);

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

现在,您只需删除以下行即可:

fromRequest(request)

TLDR

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

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

添加

如果您想在控制器外部或没有//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,因为它仅是方案,主机和端口。

答案 8 :(得分:1)

     @RequestMapping(value="/myMapping",method = RequestMethod.POST)
      public ModelandView myAction(HttpServletRequest request){

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

Root URl of the servlet

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

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

答案 9 :(得分:0)

我认为这个问题的答案是:Finding your application's URL with only a ServletContext显示了为什么你应该使用相对网址,除非你有一个非常具体的理由想要根网址。

答案 10 :(得分:0)

在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

答案 11 :(得分:0)

如果您只是对浏览器中URL的宿主部分感兴趣,则直接从 request.getHeader(“ host”))-

Internet

如果请求网址为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")); }

localhost:8082

答案 12 :(得分: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```