출처 | https://blog.naver.com/allkanet72/220964699929
// return 시
return "redirect:#";
// return 시 (데이터 포함, GET 방식)
return "redirect:#?id="+userId;
// sendRedirect 메소드 호출
response.sendRedirect("#");
// sendRedirect 메소드 호출 (데이터 포함, GET 방식)
response.sendRedirect("#?id="+userId);
만약, 폼 형식의 문서를 작성하고 나서 서버로 보내면(POST방식) 다른 페이지로 리다이렉트한다. (이런 부분이 데이터 전송에는 적절하지 않다.)
리다이렉트로 전송시 Model을 사용하지 않는다. 어차피 req,res가 있다고 가정하면 req,res 요청객체의 톰캣 내장객체가 끊어지고 새로운 url로 요청,응답객체가 생성되는데 어떻게 전달할 것인가?
그래서 리다이렉트시 Model을 사용하지 않고 RedirectAttributes를 사용한다.
만약 Spitter객체를 보낸다고 가정하면,
리다이렉트가 발생하면 원래 요청은 끊어지고, 새로운 HTTP GET 요청이 시작된다.
그래서 리다이렉트 실행 이전에 수행된 모델 데이터는 소멸한다. (그래서 모델로 전달하는게 의미없음)
리다이렉트는 HTTP GET 메소드 방식이라고 앞서 말했다. GET방식은 아래 그림처럼 header에 ? 뒤에 파라미터를 붙여서 전달한다. 때문에 URL에 노출되는 단점이 있다.
그래서 스프링은 RedirectAttributes 클래스를 제공한다.
리다이렉트가 발생하기 전에 "모든 플래시 속성을" 세션에 복사한다.
리다이렉션 이후에는 저장된 플래시 속성을 세션에서 모델로 이동시킨다.
헤더에 파라미터를 붙이지 않기 때문에 URL에 노출되지 않는다.
RedirectAttributes가 제공하는 메소드 : addFlashAttribute()
addFlashAttribute() 는 리다이렉트 직전 플래시에 저장하는 메소드다. 리다이렉트 이후에는 소멸한다.
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registPOST(BoardVO board, Model model) throws Exception{
service.regist(board);
model.addAttribute("result","success");
return "redirect:/board/listAll";
}
쿼리스트링으로 붙기는 하지만,, 보안에 너무 취약하다 ㅜㅜ
addFlashAttribute() 사용
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registPOST(BoardVO board, RedirectAttributes rttr) throws Exception{
service.regist(board);
rttr.addFlashAttribute("msg","success");
return "redirect:/board/listAll";
}