[Spring] Spring 인터셉터

haram·2023년 6월 14일
0

인터셉터란?

디스패처 서블릿과 컨트롤러 사이에 위치하여 컨트롤러로 가는 요청, 컨트롤러에서 오는 응답을 가로채어 특정 작업을 처리한다.
여기서 특정 작업이란 “url요청에 대한 log처리”, “권한체크” 와 같이 컨트롤러에서 중복하여 작성해야 하는 코드를 통해 처리되는 작업을 말한다.

HandlerIntercepter인터페이스

  • 인터셉터는 HandlerIntercepter인터페이스를 구현하여 사용한다
    아래 3가지 함수중 필요한 함수를 작성한다.

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
실행시점 : 디스패처 서블릿에서 컨트롤러로 요청이 전달되기 이전 실행

postHandle(HttpServletRequest arg0, HttpServletResponse response, Object handler, ModelAndView modelAndView)
실행시점 : 컨트롤러를 호출하여 요청을 처리한 이후 실행

  • view를 생성하기전에 호출되어 model의 데이터를 참조하거나 조작가능

afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
실행시점 : View생성까지의 모든 작업을 처리한 이후 실행

인터셉터의 구현단계

  1. HandlerIntercepter를 구현한 클래스를 작성한다.
  • 아래 예제 코드에서는 각 함수를 호출하여 로그 찍는 과정을 구현했다
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class ExampleIntercepter implements HandlerInterceptor{
	public Logger logger = LoggerFactory.getLogger(ExampleIntercepter.class);
	
	
	public boolean preHandle(HttpServletRequest request,
							 HttpServletResponse response,
							 Object handler) throws Exception{
		logger.info("인터셉터 preHandle함수 실행");
		return true;
	}
	
	public void postHandle(HttpServletRequest arg0,
						   HttpServletResponse response,
						   Object handler,
						   ModelAndView modelAndView) throws Exception{
		logger.info("인터셉터 postHandle함수 실행");
	}
	
	public void afterCompletion(HttpServletRequest request,
							    HttpServletResponse response,
							    Object handler,
							    Exception exception) throws Exception{
		logger.info("인터셉터 afterCompletion함수 실행");
	}
}
  1. selvlet-context.xml에 < intercepters>태그안에 작성한 인터페이스 클래스를 bean으로 등록한다.
<interceptors>
		<beans:bean class="intercepter.ExampleIntercepter"/>
</interceptors>

실행결과

0개의 댓글