program story

Spring MVC @RestController 및 리디렉션

inputbox 2020. 12. 29. 07:03
반응형

Spring MVC @RestController 및 리디렉션


Spring MVC @RestController로 구현 된 REST 엔드 포인트가 있습니다. 언젠가 내 컨트롤러의 입력 매개 변수에 따라 클라이언트에 http 리디렉션을 보내야합니다.

Spring MVC @RestController로 가능합니까? 그렇다면 예제를 보여 주시겠습니까?


HttpServletResponseHandler Method에 매개 변수를 추가 한 다음response.sendRedirect("some-url");

다음과 같은 것 :

@RestController
public class FooController {

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

}

직접적인 종속성을 피 HttpServletRequest하거나 다음과 같은 ResponseEntity를HttpServletResponse 반환하는 "순수한 Spring"구현을 제안합니다 .

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

메서드가 항상 리디렉션을 반환하는 경우를 사용하십시오 ResponseEntity<Void>. 그렇지 않으면 일반적으로 제네릭 유형으로 반환되는 모든 항목이 사용됩니다 .


이 질문을 보았고 아무도 RedirectView를 언급하지 않았다는 사실에 놀랐습니다. 방금 테스트했으며 다음을 사용하여 깨끗한 100 % 봄 방식으로 해결할 수 있습니다.

@RestController
public class FooController {

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

redirectspringMVC에서 의미하는 http 코드 302를 의미 Found합니다.

다음은 일종의 util 메소드입니다 BaseController.

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

그러나 때로는 301대신 http 코드를 반환하고 싶을 수 있습니다 moved permanently.

이 경우 util 메서드는 다음과 같습니다.

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

@RestController가 String반환하면 다음과 같이 사용할 수 있습니다.

return "redirect:/other/controller/";

이러한 종류의 리디렉션은 GET 요청 에만 해당되며 다른 유형의 요청을 사용하려면 HttpServletResponse를 사용하십시오.

참조 URL : https://stackoverflow.com/questions/29085295/spring-mvc-restcontroller-and-redirect

반응형