Spring MVC @RestController и перенаправление

У меня есть конечная точка REST, реализованная с помощью Spring MVC @RestController. Когда-то, зависит от входных параметров в моем контроллере. Мне нужно отправить http-перенаправление на клиент.

Возможно ли это с помощью Spring MVC @RestController, и если да, не могли бы вы показать пример?

Ответ 1

Добавьте параметр HttpServletResponse к вашему методу обработчика, затем вызовите response.sendRedirect("some-url");

Что-то вроде:

@RestController
public class FooController {

  @RequestMapping("/foo")
  void handleFoo(HttpServletResponse response) throws IOException {
    response.sendRedirect("some-url");
  }

}

Ответ 2

Чтобы избежать какой-либо прямой зависимости от HttpServletRequest или HttpServletResponse я предлагаю "чистую Spring" реализацию, возвращающую ResponseEntity, например:

HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(newUrl));
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);

Если ваш метод всегда возвращает перенаправление, используйте ResponseEntity<Void>, в противном случае все, что обычно возвращается как универсальный тип.

Ответ 3

Наткнулся на этот вопрос и был удивлен, что никто не упомянул RedirectView. Я только что проверил это, и вы можете решить эту проблему полностью на 100% spring:

@RestController
public class FooController {

    @RequestMapping("/foo")
    public RedirectView handleFoo() {
        return new RedirectView("some-url");
    }
}

Ответ 4

redirect означает http код 302, что означает Found в SpringMVC.

Вот метод util, который можно поместить в какой-нибудь BaseController:

protected ResponseEntity found(HttpServletResponse response, String url) throws IOException { // 302, found, redirect,
    response.sendRedirect(url);
    return null;
}

Но иногда может потребоваться вернуть http код 301 вместо этого, что означает moved permanently.

В этом случае вот метод util:

protected ResponseEntity movedPermanently(HttpServletResponse response, String url) { // 301, moved permanently,
    return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, url).build();
}

Ответ 5

если вы @RestController вернули строку String, вы можете использовать что-то вроде этого

return "redirect:/other/controller/";

и этот вид перенаправления предназначен только для запроса GET, если вы хотите использовать другой тип запроса, используйте HttpServletResponse