如何在@Controller @RequestMapping开始操作之前检索 URL



我继承了一个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 */) {
   ... 
}

您甚至可以接受WebRequestNativeWebRequest

@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<>("...");
   } 
   ...

最新更新