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