Spring Interceptor

Spring Interceptor

Spring MVC Project를 이용해서 web개발을 할 때 인터셉터가 꼭 필요 할 때가 있습니다.
매우 자주 쓰이는 주요한 기능임에도 불구하고 설정이 매우 간편한 이점이 있습니다.

우선 Interceptor class 를 이런 식으로 만들어 줍니다.


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 MVCInterceptor extends HandlerInterceptorAdapter{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		HttpSession session = request.getSession();
		String userId = (String) session.getAttribute("userId");
		if(userId == null) {
			response.sendRedirect(request.getContextPath());
			return false;
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}	
}

위의 코드를 보면 메서드가 세 개가 있는데, 각각의 메서드에 따라 인터셉트 하는 순간이 조금씩 다릅니다.
보통 Jsp/Html request-> Controller response-> Jsp/Html 이런 식의 라이프 사이클을 가지는데,
Jsp/Html -> Controller로 보내는 request에서 intercept하는 메서드가 preHandle입니다.
로직이 끝나고 Controller에서 Jsp/Html 로의 response를 보내 줄 때 intercept하는 메서드가postHandle, response를 받고 난 이후에 intercept하는 메서드가 afterCompletion 입니다.

저는 예시코드에서 HttpSession에 원하는 값이 들어가 있지 않으면 Context Root로 보내기 위해 preHandle을 오버라이딩 하여 썼습니다. 위의 코드에서 true 값이 의미하는것은 요청받은 URL그대로 보내는 것입니다.

이후 사진의 servlet-context.xml에서 bean 으로 추가 해 주신 뒤 mapping 해 주시면 설정이 끝납니다.

<beans:bean id="Interceptor" class="com.example.example.Interceptor"/>
<interceptors>
<interceptor>
<mapping path="/board/boardWrite"/>
<beans:ref bean="Interceptor"/>
</interceptor>
</interceptors>