从HttpServletRequest获取当前使用的协议名称?

时间:2015-06-18 00:45:26

标签: java spring tomcat

我正在Spring MVC控制器中构建一个新的URL,以传递回客户端。目前我正在尝试这个:

// httpRequest is the current HttpServletRequest

new URL(httpRequest.getProtocol(),
    httpRequest.getServerName(),
    httpRequest.getServerPort(),
    httpRequest.getContextPath().concat("/foo/bar.html"));

问题是httpRequest.getProtocol()给了我“HTTP / 1.1”而不仅仅是“HTTP”。我可以修剪但是想知道是否有更优雅的方式。

2 个答案:

答案 0 :(得分:9)

协议是HTTP / 1.1,因为它是HTTP的特定版本。 ServletRequest#getScheme本身给出的方案是http

new URL(httpRequest.getScheme(),
httpRequest.getServerName(),
httpRequest.getServerPort(),
httpRequest.getContextPath().concat("/foo/bar.html"));

答案 1 :(得分:0)

在2020年,我建议您使用ServletUriComponentsBuilder,它是静态方法,例如ServletUriComponentsBuilder#fromCurrentRequest,可帮助您使用上一个请求构建URL。

示例:

URL url = ServletUriComponentsBuilder
     .fromCurrentRequest()
     .path("/foo/bar.html")
     .encode() // To encode your url... always usefull
     .build()
     .toUri()
     .toURL()

此外,如果您想在同一应用程序上进行重定向,请仅返回状态为302的“ redirect:/foo/bar.html”,Spring Boot MVC会将其转换为常规重定向。

示例:

@ResponseBody
@GetMapping("/some/endpoint")
@ResponseStatus(HttpStatus.FOUND)
public ModelAndView redirectToFoo() {
   return new ModelAndView("redirect:/foo/bar.html");
}