在 Spring MVC 中获取 Web 应用程序的根/基本 url 的最佳方法是什么?
基本网址 = http://www.example.com或http://www.example.com/VirtualDirectory
在 Spring MVC 中获取 Web 应用程序的根/基本 url 的最佳方法是什么?
基本网址 = http://www.example.com或http://www.example.com/VirtualDirectory
我更喜欢使用
final String baseUrl =
ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
它返回一个完全构建的 URL、方案、服务器名称和服务器端口,而不是连接和替换容易出错的字符串。
如果基本 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>
您还可以创建自己的方法来获取它:
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;
}
我知道这个问题已经很老了,但这是我发现的关于这个主题的唯一一个,所以我想为未来的访问者分享我的方法。
如果要从 WebRequest 获取基本 URL,可以执行以下操作:
ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request);
这将为您提供方案(“http”或“https”)、主机(“example.com”)、端口(“8080”)和路径(“/some/path”),同时fromRequest(request)
为您提供查询参数也是。但由于我们只想获取基本 URL(方案、主机、端口),我们不需要查询参数。
现在您可以使用以下行删除路径:
ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null);
最后,我们获取基本 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)
因为它已经只有方案、主机和端口。
request.getRequestURL().toString().replace(request.getRequestURI(), request.getContextPath())
简单地 :
/*
* 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();
}
在控制器中,使用HttpServletRequest.getContextPath()
.
在 JSP 中使用 Spring 的标签库:或 jstl
要么注入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();
在 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>
@RequestMapping(value="/myMapping",method = RequestMethod.POST)
public ModelandView myAction(HttpServletRequest request){
//then follow this answer to get your Root url
}
如果您在 jsp 中需要它,则进入控制器并将其作为对象添加到 ModelAndView 中。
或者,如果您在客户端需要它,请使用 javascript 检索它: http ://www.gotknowhow.com/articles/how-to-get-the-base-url-with-javascript
我认为这个问题的答案:仅使用 ServletContext 查找应用程序的 URL说明了为什么应该使用相对 url,除非您有非常具体的原因需要根 url。
如果您只是对浏览器中 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
这里:
在 [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```