본문으로 바로가기

POST/GET방식으로 예약생성같은 DB작업이 있는 페이지를 끝내고 결과페이지를 일반적으로 포워딩할경우 F5나 새로고침등으로 서버에 동일한 요청을 보내어 문제가 발생할 가능성이 있어 주요 서비스에는 중복 요청이 들어가지 않도록 결과는 redirect 할수있도록 처리가 필요합니다.

 

A.hnt 화면 (submit >> B.hnt 맵핑 Ctr에서 처리 후  (redirect) >>  C.hnt 맵핑 Ctr에서 처리후 결과 view 포워딩

 

* 리다이렉트시 데이터 보내려면 아래와 같이 GET방식으로 데이터 붙여서 전송이 가능하나

데이터 전송시 정보를 숨길 수 없고 URL인코딩등의 문제가 있습니다.

 

1
return "redirect:/C.hnt?param1=1&param2=2";   
cs

 

이를 해결하기 위해 RedirectAttributes / FlashMap 객체를 사용하여 redirect시 편리하게 데이터 전송이 가능 합니다.

(Spring3.1 이상에서 제공)

 

위 빈객체를 사용하기 위해서는 web.xml 에서 설정한 Spring Servlet 컨피그 설정파일에 아래 mvc 관련 설정을 추가해줘야 합니다.

http://zgundam.tistory.com/10          <mvc:annotation-driven/> 이 추가해 주는 빈객체 종류

 

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <context:component-scan base-package="com.hanatour.test" />
    <mvc:annotation-driven/>
</beans>
cs

 

 

사용 예제

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
31
32
33
34
35
36
37
38
//SUBMIT 받아서 처리하는 컨트롤러
@RequestMapping("/B.hnt")ㄱ
public String B(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttr){ 
 /* 데이터 처리 ing....*/
 
 //1. 세션에 잠시 담았다가 redirect 후 소멸
 redirectAttr.addFlashAttribute("param1","1");
 redirectAttr.addFlashAttribute("param2","2");
 
 //2. URL뒤에 붙여서 보냄 (get방식으로 받는것과 동일)
 //redirectAttr.addAttribute("param1","1");
 //redirectAttr.addAttribute("param2","2");
  
 return "redirect:/C.hnt";
}
 
//리다이렉트 URL 처리 컨트롤러
@RequestMapping("/C.hnt")
public String C(HttpServletRequest request, HttpServletResponse response, modelMap modelMap){
    String param1  = "";  // 오브젝트 타입이라 캐스팅해줌
    String param2  = "";      
   
   //1. addFlashAttribute > redirect 후 소멸 (세션기반)
    Map<String, ?> redirectMap = RequestContextUtils.getInputFlashMap(request);  
    if( redirectMap  != null ){
        param1 =  (String)redirectMap.get("param1") ;  // 오브젝트 타입이라 캐스팅해줌
         param2 =  (String)redirectMap.get("param2") ;  
    }
 
    //2. addAttribute 
    //param1 = request.getParameter("param1");
    //param2 = request.getParameter("param2");
 
    // return to view
    modelMap.put("param1",param1);
    modelMap.put("param2",param2);
    return "jsp/C";  // 클라이언트에게 보여줄 jsp/C.jsp로 화면 구성하여 포워딩
}
cs

 


Reference

http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/support/RedirectAttributes.html

http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/FlashMap.html

http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/support/RequestContextUtils.html

http://blog.naver.com/brilliantjay?Redirect=Log&logNo=220678617150