본문 바로가기

Web[웹]/Spring Framework

[Spring] 컨트롤러에서 뷰를 분기하는 리다이렉트 & 인터셉트

 

리다이렉트와 인터셉트

 

리다이렉트

 

리다이렉트(redirect)는 컨트롤러에서 뷰를 분기하는 방법으로, 지금의 페이지에서 특정 페이지로 전환하는 기능을 한다.

 

 

// Modify
@RequestMapping(value = "/modifyForm")
public String modifyForm(Model model, HttpServletRequest request) {
		
    HttpSession session = request.getSession();
    Member member = (Member) session.getAttribute("member");
		
    /* member의 존재 여부 */
    if(null == member) {
        return "redirect:/"; // null일 경우 메인페이지로 리다이텍트
    } else {
        model.addAttribute("member", service.memberSearch(member));
    }
		
    return "/member/modifyForm";
}
/* ModelAndView 일 경우*/
// Remove
@RequestMapping("/removeForm")
public ModelAndView removeForm(HttpServletRequest request) {
		
    ModelAndView mav = new ModelAndView();
		
    HttpSession session =  request.getSession();
    Member member = (Member) session.getAttribute("member");
		
    if(null == member) {
        mav.setViewName("redirect:/"); //main로 리다이렉트
    } else {
        mav.addObject("member", member);
        mav.setViewName("/member/removeForm");
    }
		
		
    return mav;
}

 


 

 

인터셉트

 

따로 컨트롤러에 위처럼 설정할 필요 없이 HandlerInterceptorAdapter 를 상속받는 파일을 만들어서, 전체적으로 관리할 수 있다. 다시말해서, 리다이렉트를 사용해야하는 경우가 많은 경우 HandlerInterceptor를 이용하면 효율적이다.

 

 

/* MemberLoginInterceptor.java */
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MemberLoginInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		HttpSession session = request.getSession(false);
		if(session != null) {
			Object obj = session.getAttribute("member");
			if(obj != null) 
				return true;
		}
		
		/* 리다이렉트 */
		response.sendRedirect(request.getContextPath() + "/");
		return false;
	}
	
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		super.postHandle(request, response, handler, modelAndView);
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
		super.afterCompletion(request, response, handler, ex);
	}
}

 

위 파일은 스프링 프레임워크에서 지원하는 'HandlerInterceptorAdapter' 를 사용하는 것이다. 그리고 이를 사용함을 명시해주기 위해 스프링 설정 파일에 등록해주어야 한다.

 

<interceptors>
    <interceptor>
        <mapping path="/member/modifyForm"/>
        <mapping path="/member/removeForm"/>
        <beans:bean class="com.opentogether.test.member.MemberLoginInterceptor"/>
    </interceptor>
</interceptors>

 

아래 처럼 표현도 가능하다.

 

<interceptors>
    <interceptor>
        <mapping path="/member/**"/> <!-- 이 경로 모든 파일을 리다이렉트-->
        <!-- 아래는 예외 목록 -->
        <exclude-mapping path="/member/joinForm"/>
        <exclude-mapping path="/member/join"/>
        <exclude-mapping path="/member/loginForm"/>
        <exclude-mapping path="/member/login"/>
        <exclude-mapping path="/member/logout"/>
        <exclude-mapping path="/member/modify"/>
        <exclude-mapping path="/member/remove"/>
        <beans:bean class="com.opentogether.test.member.MemberLoginInterceptor"/>
    </interceptor>
</interceptors>