티스토리 뷰

 

RedirectAttributes 클래스를 사용하여 전달할 수 있다. 

- RedirectAttributes 클래스는 Spring 3.1 버전에 추가되었다.

- redirect시 RedirectAttributes 클래스를 이용해 효과적으로 alert창을 띄울 수 있다.

 

https://m.blog.naver.com/allkanet72/220964699929

 

폼 형식의 문서를 작성 후, 서버로 보내면(POST 방식) 곧이어 다른 페이지로 리다이렉트 한다. 문제는 이러한 리다이렉트 방식이 GET 방식​ 이라 데이터 전송에는 적절하지 않다.

리다이렉트가 발생하면 원래 요청은 끊어지고, 새로운 HTTP GET 요청이 시작된다.(브라우저에게 이 URL로 리다이렉트해!)  때문에 리다이렉트 실행 이전에 수행된 모델 데이터는 소멸한다. 따라서 리다이렉트로 모델을 전달하는 것은 의미 없다.

 

이런 경우 때문에 SpringMVC에서는 model에 data를 담고 Redirect하는 경우, Primitive Type(기본자료형)에 한해서 자동으로 url의 Parameter로 추가해서 데이터를 넘겨준다.

 

그러나 리다이렉트 방법으로도 데이터를 전달하는 방법이 있다. 

 

이러한 문제를 Spring 3.1 버전에 추가된 RedirectAttributes 클래스를 통해 해결할 수 있다. RedirectAttributes 인터페이스는 기존의 Model 인터페이스를 확장한 것이다.

 

스프링은 RedirectAttributes 클래스를 제공한다. 이 클래스는 모델의 기능을 그대로 확장(extends)했으며, 몇개의 도움 메소드가 추가됐다.

 

기존메서드 addAttribute()

모델의 기능을 확장한 것이기 때문에 addAttribute()시에 GET방식으로 파라미터들이 전달된다.

 

RedirectAttributes가 제공하는 추가된 메소드 addFlashAttribute()

파라미터들을 URL에 담지 않고 보이지 않게 전달해준다. POST방식으로 전달하는것 처럼 보일 뿐 엄연히 GET방식의 요청이다. 

 

- RedirectAttributes리다이렉트가 발생하기 전에 모든 플래시 속성을 세션에 복사한다. 리다이렉션 이후에는 저장된 플래시 속성을 세션에서 모델로 이동시킨다. 헤더에 파라미터를 붙이지 않기 때문에 URL에 노출되지 않는다.

- addFlashAttribute() 는 리다이렉트 직전 플래시에 저장하는 메소드다. 리다이렉트 이후에는 소멸한다.

 

FlashAttributes란?

redirect시 Primitive Type 이 아닌 Object를 전달하고 싶은 경우도 있을 것이다. 이 때 사용할 수 있는 것이 바로 FlashAttributes이다. FlashAttributes는 RedirectAttributes와 마찬가지로 Session에 데이터를 담는 것이 올바르지 않을 때 사용할 수 있지만, 사실 FlashAttributes도 Session을 이용하여 데이터를 전달한다.

 

Redirect시 Parameter로 데이터를 전달하는 것은 문자열로 넘어가기 때문에, 다른 오브젝트를 파라미터로 전달하기 위해서 이 FlashAttributes를 사용한다. 아까 말한 것처럼 FlashAttributes는 Session을 이용하여 데이터가 전달된다. 이 때 넘겨받은 핸들러에서만 사용이 가능하고, 넘겨받은 핸들러가 종료될 때 Session에서 FlashAttributes에 저장된 데이터들은 삭제가 된다.

 

FlashAttributes를 추가하는 방법은 RedirectAttributes의 메소드를 이용하여 추가할 수 있다. 

addFlashAttribute()

모델에 담긴 flashAttributes객체는 @ ModelAttribute를 이용하여 가져올 수도 있으며, 자동으로 Model에 등록되기 때문에 model객체를 asMap()을 이용해 Map으로 변환하여 key값을 통해서 가져올 수도 있다.

 

redirect 되는 메소드에서 받을 때는 어떻게 받아야 하는지 궁금했는데 아래와 같이 사용한다고 한다.

데이터를 받을 때 RequestContextUtiles.getInputFlashMap(request)

public String redirectGetTest(HttpServletRequest request) throws Exception{
    Map<String, ?> flashMap =RequestContextUtils.getInputFlashMap(request); 
        if(flashMap!=null) {   
            testVO =(testVO)flashMap.get("testVO");
        }  
    return "index";
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함