Как мне получить URL до того, как @Controller @RequestMapping вступит в действие? - PullRequest
0 голосов
/ 13 февраля 2019

Я унаследовал веб-приложение JAVA Spring MVC.Я совершенно новичок в Spring MVC и очень новичок в JAVA.Но моя первая задача - добавить URL-адрес приложения в электронное письмо, которое уже создано с помощью кода.

По сути, это способ для пользователя щелкнуть ссылку и перейти непосредственно на определенную страницу.Но когда я пробую все различные вещи, которые я видел здесь, которые включают HttpServletRequest и, что более важно, getRequestURL().

, я могу получить URL только после того, как Контроллер вступит во владение.Что мне нужно, так это то, что я буду называть ссылочным URL - URL приложения, который я вижу в браузере.

Контроллер является службой REST и возвращает localhost:8181/etc/etc, которая даже не включает домен для сайта.Я пробовал различные методы, такие как getHeader("Referer") и т. Д. Опять же, они просто возвращают URL-адрес пост-контроллера.Я попытался добавить код, чтобы получить правильный пре-контроллер URL, а затем передать его в метод контроллера.Тем не менее дает мне пост-контроллер URL.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Передайте параметр типа UriComponentsBuilder в метод вашего контроллера, и он будет предварительно заполнен базовым контекстом, который пользователь первоначально использовал для выполнения запроса.Тогда вы можете сделать это:

String uri = MvcUriComponentsBuilder.relativeTo(uriBuilder)
        .withMethodName(MyController.class, "someMethod", parameterValue)
        .toUriString();
0 голосов
/ 13 февраля 2019

Вам нужен какой-то 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 */) {
   ... 
}

Вы даже можете принять 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<>("...");
   } 

   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...