[ Redirect ]
먼저, 리다이렉트(Redirect)의 정의를 알고간다.
리다이렉트란 말 그대로 re(다시) + 지시하다(direct) 다시 지시하는 것을 말한다.
예를 들어 브라우저가 "www.test.com/page1" URL을 웹 서버에 요청했다.
서버는 HTTP 응답 메시지를 통해
"www.test.com/page2 로 다시 요청하라"~ 라고 브라우저에게 다른 URL(길, 방향)을 지시할 수 있다.
순서는 밑의 그림과 같다.
HTTP 리다이렉트는 HTTP 표준으로 정의 되어 있는데 최초 요청을 받은
예시)
리다이렉트의 예로는 간단하게 네이버 카페의 높은 등급만 볼 수 있는 글이 있을때, 해당 글의 URL로 접근하면 웹서버는 글에 접근하는 요청의 로그인 여부, 등급을 검사하여야 할 것이다. 이때, 로그인이 되지 않은 경우는 로그인 페이지로 리다이렉트 시킬 필요가 있고, 등급이 안된다면 경고창이 뜨는 페이지로 리다이렉트 시킬 필요가 있다.
[ RedirectAttributes ]
RedirectAttributes는 redirect시 데이터를 전달할 수 있는 방법 중 하나이다.
RedirectAttributes 클래스를 통해 string 형태와 map, list, vo 등의 object 형태로 넘겨줄 수 있다.
먼저 , Redirect 형식은 HTTP GET방식이기 때문에 데이터 전송에는 적합하지 않다고 볼 수 있다.
위 방식처럼 spitter 라는 객체를 Redirect 방식으로 넘겨주려고 할때, 리다이렉트가 발생하면 원래 요청은 끊어지고, 새로운 HTTP GET 요청이 시작된다.
때문에 리다이렉트 실행 이전에 수행된 모델 데이터는 소멸한다. 따라서 리다이렉트로 모델을 전달하는 것은 의미 없다.
방법이 아예 없지는 않다. GET방식의 특징은 header에 ? 뒤에 파라미터를 붙여서 전달할 수 있다.
그러나 위의 사진처럼 URL에 노출되는 단점이 있다.
따라서 스프링은 RedirectAttributes 클래스를 제공한다. 이 클래스는 모델의 기능을 그대로 확장(extends)했으며, 몇개의 도움 메소드가 추가됐다.
RedirectAttributes의 Flash attributes는 위의 그림처럼 리다이렉트가 발생하기 전에 모든 플래시 속성을 세션에 복사한다. 리다이렉션 이후에는 저장된 플래시 속성을 세션에서 모델로 이동시킨다.
헤더에 파라미터를 붙이지 않기 때문에 URL에 노출되지 않는다.
addFlashAttribute()는 리다이렉트 직전 플래시에 저장하는 메서드이다. Redirect 이후에는 소멸한다.
예제를 살펴본다.
1. RedirectAttributes의 addAttribute 을 사용한 String 전달
@RequestMapping(value="/test.com", method =RequestMethod.POST)
public String insertAA(ModelMap model, RedirectAttributes rttr) throws Exception{
String message ="등록되었습니다.";
rttr.addAttribute("message", message);
return "redirect:/test.com";
}
String 을 사용하면 아래와 같이 URL에 노출된다.
/test.com?message=등록되었습니다.
2. addFlashAttribute 사용한 String 전달
@RequestMapping(value="/test.com", method =RequestMethod.POST)
public String insertAA(ModelMap model, RedirectAttributes rttr) throws Exception{
String message ="등록되었습니다.";
rttr.addFlashAttribute("message", message);
return "redirect:/test.com";
}
addFlashAttribute 의 경우 데이타가 post 형식으로 전달이 된다.
String 문자열을 전달했을 경우에 redirect되는 method의 jsp 파일에서
1
|
${message}
|
처럼 출력을 해보면 한번만 "등록되었습니다." 가 출력된다.
Reference
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=allkanet72&logNo=220964699929
https://web-obj.tistory.com/455
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) UserDetailsService (0) | 2022.01.24 |
---|---|
Springboot) Springsecurity : AuthenticationManager , AuthenticationProvider , UserDetailsService (0) | 2022.01.21 |
Springboot) @PostMapping (0) | 2022.01.11 |
Springboot) @RestController, @RequestMapping, @GetMapping 예제를 통한 학습 (0) | 2022.01.10 |
Springboot) JPA에서 M:N(다대다) 처리 (2) , @EntityGraph (0) | 2022.01.07 |