YONG-MIN

Interceptor에서 RedirectAttributes 이용하기

개발언어/Java, Spring 2017. 12. 12. 17:55

Spring에선 아래와 같은 방법으로 RedirectAttributes를 이용해 컨트롤러에서 컨트롤러로 파라미터를 전송가능합니다.

FlashAttribute는 1회성이기 때문에 ModelAndView로 addObject해서 View까지 넘기는 모습입니다.


// RedirectAttributes로 파라미터를 넘기면서 요청하는 테스트 컨트롤러
@RequestMapping(value="/test/call.do")
public ModelAndView callTest(RedirectAttributes redirectAttributes) throws Exception{
	ModelAndView mv = new ModelAndView("redirect:/test/receive.do");
	redirectAttributes.addFlashAttribute("param1", "TEST1");
	redirectAttributes.addFlashAttribute("param2", "TEST2");
	redirectAttributes.addFlashAttribute("param3", "TEST3");
	return mv;
}

@RequestMapping(value="/test/receive.do")
public ModelAndView receiveTest(HttpServletRequest request) throws Exception{
	ModelAndView mv = new ModelAndView("/test/view");
	Map<String, Object> inputFlashMap = (Map<String,Object>) RequestContextUtils.getInputFlashMap(request);
	
	if(inputFlashMap!=null && inputFlashMap.isEmpty()==false){
		Iterator<Entry<String,Object>> iterator = inputFlashMap.entrySet().iterator();
		Entry<String,Object) entry = null;
		
		while(iterator.hasNext()){
			entry=iterator.next();
			mv.addObject(entry.getKey(), entry.getValue());
		}
	}
	return mv;
}


그러나... 하다보니 Interceptor에서 RedirectAttributes를 사용할 일이 생겼습니다.


통상 인터셉터는 preHandle Override 하는 것이다 보니 위 callTest처럼 파라미터로 "RedirectAttributes redirectAttributes"를 넣을 수가 없습니다.

그래서 찾아낸 방법... 

Interceptor에 FlashMap과 FlashMapManager 객체를 만들어 Request에 생성하는 방법입니다.


FlashMap flashMap = new FlashMap();
flashMap.put("msg", MessageUtils.getMessage("login.invalidSession"));
FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
flashMapManager.saveOutputFlashMap(flashMap, request, response);