본문 바로가기
Framework/Spring

[SPRING 시작-3] #Interceptor 사용법 (Eclipse+Spring+Maven) / <interceptors> 설정방법

by 나비와꽃기린 2016. 10. 11.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


**** 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은 컨트롤러가 실행되지 않았기 때문에 당연히 실행되지 않는다.