일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 김영한JPA
- HTTP3
- HTTPMESSAGE
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- 무상태프로토콜
- hibernate.dialect
- Invalid bound statement (not found)
- initialDelay
- gitrevert
- fixedDelay
- JPA
- RFC723x
- 멱등활용
- DB방언
- @Entity
- 매핑정보가없는필드
- gitreset
- org.apache.ibatis.binding.BindingException
- Git
- 캐쉬가능
- Transaction not successfully started
- KAKAOLOGINAPI
- anyMatch
- http
- @Table
- 네이버로그인API
- 자바ORM표준프로그래밍
- 네이버 연결된 서비스
- SpringBoot
- 데이터베이스 방언
Archives
- Today
- Total
twocowsong
Redirect, forward, RedirectAttributes 본문
redirect
@GetMapping("/init")
public void init(Model model, HttpServletResponse response) throws IOException{
response.sendRedirect("/redirect");
}
@ResponseBody
@GetMapping("/redirect")
public String redirect() {
return "result : redirect!!!";
}
Redirect를 사용하다보면 데이터를 전송하지 못한다는 단점이있습니다. 리다이렉트는 호출 시 클라이언트를 한번 갔다가 호출되기때문에 request에 데이터가 담겨있지않게됩니다.
이때 데이터를 전송시키고싶다! 이럴때 forward를 사용하면 데이터를 전달할수 있습니다. forward는 서버에서만 처리하기때문에 데이터가 존재하죠.
forward
@ResponseBody
@GetMapping("/init")
public void init(HttpServletRequest request,
HttpServletResponse response,
Model model) throws Exception {
request.setAttribute("value1", "A");
request.setAttribute("value2", "B");
RequestDispatcher reqDispatcher = request.getRequestDispatcher("/redirect");
reqDispatcher.forward(request, response);
}
@ResponseBody
@GetMapping("/redirect")
public String redirect(HttpServletRequest request) {
log.info("value1 : " + request.getAttribute("value1"));
log.info("value2 : " + request.getAttribute("value2"));
return "OK!";
}
꼭 리다이렉트를 사용하여 페이지를 이동해야하며 데이터를 꼭 받아야한다면 방법이있습니다.
RedirectAttributes(url 노출)
@GetMapping("/init")
public String init(RedirectAttributes rab) {
// GET
rab.addAttribute("value1" , "A");
rab.addAttribute("value2" , "B");
return "redirect:/redirect";
}
@ResponseBody
@GetMapping("/redirect")
public String redirect(@RequestParam String value1, @RequestParam String value2) {
log.info("value1 : " + value1);
log.info("value2 : " + value2);
return "result : redirect!!!";
}
위처럼 데이터를 받아서 사용해도되지만 url에 노출된다는 단점이있습니다.
RedirectAttributes를 사용하지만 url에 노출되기 싫은 상황에는 아래와같이 사용하시면됩니다.
RedirectAttributes(url 노출X)
@GetMapping("/init")
public String init(RedirectAttributes rab) {
// POST
rab.addFlashAttribute("value1" , "A");
rab.addFlashAttribute("value2" , "B");
return "redirect:/redirect";
}
@ResponseBody
@GetMapping("/redirect")
public String redirect(HttpServletRequest request) {
Map<String, ?> redirectParam = RequestContextUtils.getInputFlashMap(request);
log.info("value1 : " + redirectParam.get("value1"));
log.info("value2 : " + redirectParam.get("value2"));
return "result : redirect!!!";
}
여담 )
@GetMapping("/init")
public String init(Model model) {
return "redirect:/redirect";
}
@ResponseBody
@PostMapping("/redirect")
public String redirect() {
return "result : redirect!!!";
}
리다이렉트 호출시에는 꼭 GET방식만되니 GetMapping로 맵핑해주세요. post로 받으시면 405에러가 떨어집니다.
'IT > SpringBoot' 카테고리의 다른 글
@RestController @Controller (0) | 2022.01.24 |
---|---|
@Scheduled (0) | 2022.01.23 |
@ModelAttribute, @PathVariable, @RequestBody (0) | 2022.01.18 |
@Data (0) | 2022.01.18 |
@Value 어노테이션 (0) | 2022.01.18 |