在@Controller @RequestMapping生效之前,如何检索URL?

时间:2019-02-12 22:50:03

标签: java spring-mvc

我已经继承了JAVA Spring MVC Web应用程序。我是Spring MVC的新手,也是JAVA的新手。但是我的首要任务是将应用程序的URL添加到已经通过代码生成的电子邮件中。

基本上,这是用户单击链接并直接转到特定页面的一种方式。但是,当我尝试在这里看到的涉及HttpServletRequest,更重要的是getRequestURL()的所有各种事物时。

我只能在Controller接管后获取URL。我需要的是我将称为参照URL的东西-我在浏览器中看到的应用程序URL。

控制器是REST服务,它返回localhost:8181/etc/etc,甚至不包含该站点的域。我尝试了各种方法,例如getHeader("Referer")等。同样,它们只是返回后控制器URL。我尝试添加代码以获取正确的URL pre-Controller,然后将其传递给Controller方法。仍然给了我后控制器URL。

2 个答案:

答案 0 :(得分:0)

您需要某种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检索概念应用于@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<>("...");
   } 

   ...

答案 1 :(得分:0)

将类型UriComponentsBuilder的参数传递到您的控制器方法中,并将使用用户最初用于发出请求的基本上下文预填充该参数。然后,您可以执行以下操作:

String uri = MvcUriComponentsBuilder.relativeTo(uriBuilder)
        .withMethodName(MyController.class, "someMethod", parameterValue)
        .toUriString();