Springでredirectを利用する際、あんまりHttp Methodを意識したことがないかもしれません。ただ、何もしなければ、デフォルトでGETとなり、POSTしたいときは困ります。
HTTP 1.1 プロトコル リファレンスに従って、ステータス コード 301 (Moved Permanently) および 302 (Found) により、リクエスト メソッドを POST から GET に変更できます。
リクエストメソッドを POST から GET に変更することを許可したくなければ、307 (Temporary Redirect) および 308 (Permanent Redirect) ステータスコードを指定すればOKです。
@PostMapping("/redirectPostToPost")
public ModelAndView redirectPostToPost(HttpServletRequest request) {
request.setAttribute(
View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);
return new ModelAndView("redirect:/redirectedPostToPost");
}
@PostMapping("/redirectedPostToPost")
public ModelAndView redirectedPostToPost() {
return new ModelAndView("redirection");
}
こうすれば、redirectはPOSTで送信されます。もう少しちゃんとコードを書いて検証しますと、
@RestController
@RequestMapping("app")
public class TestController {
@PostMapping("/addCompany")
public ModelAndView addCompany(@RequestBody Company company, HttpServletRequest request) {
System.out.println("First method: " + company.name);
request.setAttribute(
View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);
return new ModelAndView("redirect:/app/postmethod/");
}
@PostMapping("/postmethod")
public void getData(@RequestBody Company company) {
System.out.println("Redirected: " + company.name);
}
public static class Company {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
bodyに「{"name": "Test Company"}
」を入れてPOSTで「http://localhost:8080/app/addCompany
」に送信しますと、以下のような結果となります。
First method: Test Company Redirected: Test Company
コメント