我继承了一个JAVA Spring MVC Web应用程序。我是Spring MVC的新手,也是JAVA的新手。但我的第一个任务是将应用程序的 URL 添加到已通过代码生成的电子邮件中。
它基本上是用户单击链接并直接转到特定页面的一种方式。但是当我尝试我在这里看到的所有涉及HttpServletRequest
,更重要的是getRequestURL()
的各种事情时。
我只能在控制器接管后获取 URL。我需要的是我将称为引用 URL 的内容 - 我在浏览器中看到的应用程序 URL。
控制器是一个 REST 服务,返回localhost:8181/etc/etc
甚至不包括站点的域。我已经尝试了各种方法,例如getHeader("Referer")
等。同样,它们只返回后控制器 URL。我尝试添加代码以获取正确的 URL 预控制器,然后将其传递给控制器方法。仍然给我后控制器 URL。
为 UriComponentsBuilder
的参数传递到控制器方法中,它将预填充用户最初用于发出请求的基本上下文。然后你可以这样做:
String uri = MvcUriComponentsBuilder.relativeTo(uriBuilder)
.withMethodName(MyController.class, "someMethod", parameterValue)
.toUriString();
某种HandlerInterceptorAdapter
/HandlerInterceptor
。
在 preHandle
方法中,可以保留HttpServletRequest
对象。
@Override
public boolean preHandle(
final HttpServletRequest request,
final HttpServletResponse response,
final Object handler
) throws Exception {
// Obtain only the hostname, with the associated port
final String hostOnly = request.getHeader("Host");
// Obtain the request URL, excluding query parameters
final String completeUrl = request.getRequestURL().toString();
// ... Continue towards the method handler
}
request.getRequestURL()
返回一个 StringBuffer
,您可以使用该 URL 在从中构建String
之前操作 URL。
如果需要,可以将相同的URL检索概念应用于@Controller
/@RestController
处理程序方法。只需插入一个HttpServletRequest
作为输入参数。
@GetMapping
public ResponseEntity<?> myHandlerMethod(
final HttpServletRequest request,
/* other parameters */) {
...
}
您甚至可以接受WebRequest
或NativeWebRequest
@GetMapping
public ResponseEntity<?> myHandlerMethod(
final WebRequest request,
/* other parameters */) {
final String host = request.getHeader("host");
...
}
@GetMapping
public ResponseEntity<?> myHandlerMethod(
final NativeWebRequest request,
/* other parameters */) {
final HttpServletRequest nativeRequest = request.getNativeRequest(HttpServletRequest.class);
final String host = request.getHeader("host");
...
}
根据您的评论进行编辑。
@PostMapping(value = "myurl/{x}/(y)", produces = ...")
public ResponseEntity<String> doSomething(
final HttpServletRequest request,
@PathVariable("x") final String x,
@PathVariable("y") final String y) {
final String hostOnly = request.getHeader("Host"); // http://yourdomain.com:80
if (service.sendEmail(x, y, hostOnly)) {
return new ResponseEntity<>("...");
}
...