**** Interceptor는 Controller가 요청되기 전에 수행된다.
이 점 을 이용하여, Controller 호출 전 공통 로직 처리나 인증 처리 등에 활용된다. 아래에 자세히 설명해놨다!! *****
사진출처 : http://egloos.zum.com/springmvc/v/504151
<<Interceptor 설정방법>>
(1) servlet.xml
com.common.loggerTest의 package의 loggerInterceptor 클래스가 Dispatacher Servlet에 우선시하여 읽히게 된다는 의미.
모든 url 처리는 /** 로 작성하고,
특정 Controller만 처리하기 위해서는 <mapping path="/login" /> 등으로 추가적으로 기술하여 처리하면 된다.
<interceptors>
<interceptor>
<mapping path="/**" />
<beans:bean class="com.common.loggerTest.LoggerInterceptor"></beans:bean>
</interceptor>
</interceptors>
(2) LoggerInterceptor 의 preHandle postHandle
인터셉터는 HandlerInterceptorAdapter 클래스를 상속받아서 만든다.
HandlerInterceptorAdapter에서는 사용할 수 있는 몇가지 메서드들이 있는데
그 중 주로 사용하는 메서드가 전처리기와 후처리기다.
전처리기(preHandle) : client -> controller 로 요청할 때, 그 요청을 처리
추허리기(postHandle) : controller -> client로 요청을 줄 때 처리
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoggerInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(LoggerInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/*로직처리*/
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
preHandle 메소드는 컨트롤러가 호출되기 전에 실행되어 컨트롤러 실행 이전에 처리해야 할 작업이 있다거나, 요청정보를 가공하거나 추가하는 경우에 사용할 수 있다. 또한 요청에 대한 로그를 남기기 위해 사용하기도 한다. 리턴 값이 true이면 핸들러 실행 체인의 다음 단계로 진행되지만, false라면 작업을 중단하고 리턴하므로 컨트롤러와 남은 인터셉터들은 실행되지 않는다.
postHandle 메소드는 컨트롤러를 실행한 후 에 호출되므로 주로 후처리 작업을 위해 사용한다. 이 메소드에서는 컨트롤러가 돌려준 ModelAndView 타입의 정보가 제공되기 때문에 컨트롤러 작업 결과를 참조하거나 조작할 수 있다.
preHandle에서 false를 리턴하면 porstHandle은 컨트롤러가 실행되지 않았기 때문에 당연히 실행되지 않는다.