728x90
    
    
  
Interceptor
spring container가 관리한다. 따라서 스프링의 모든 빈 객체에 접근할 수 있다.
DispatcherServlet에서 Controller를 호출하기 전에 먼저 동작한다.
servlet-context.xml에서 설정한다.
* filter는 Servlet container에서 관리한다. DispatcherServlet 이전에 실행되고, web.xml에서 설정한다.
사용자 인터셉터.java
spring 5.3 이상부터는 extends HandlerInterceptorAdapter 하지 않고 implements HandlerInterceptor한다. HandlerInterceptor 인터페이스를 상속받더라도 필요없는 메서드는 오버라이딩하지 않아도 된다.
| public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | - controller 수행 전 호출 - return true : 다음 interceptor 또는 controller 수행 - return false : request 바로 종료  | 
| public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,  ModelAndView modelAndView)  | 
- controller 수행 후 호출 | 
| public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) | - view를 통해 클라이언트에 응답 전송한 뒤 실행 - 예외가 발생해도 실행됨 - 하지만 view가 만들어지지 않았다면 실행되지 않음  | 
public class ___Interceptor implements HandlerInterceptor {
	private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		logger.debug("preHandle() {} 호출" ,handler);
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		logger.debug("postHandle() {} 종료" ,handler);
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		logger.debug("afterCompletion() {} View 응답" ,handler);
	}
}
servlet-context.xml
사용할 인터셉터와 url을 매핑한다.
| mapping | 인터셉터가 동작할 url | 
| exclude-mapping | mapping된 url에서 제외할 url | 
| bean | 인터셉터 class | 
| ref | bean으로 미리 설정한 인터셉터 | 
<beans:bean id="인터셉터아이디" class="com.____.interceptor.ConfirmInterceptor" />
<interceptors>
	<interceptor>
		<mapping path="/**" />
		<exclude-mapping path="/_____/**" />
		<beans:bean class="com.____.interceptor.LoggingInterceptor" />
		<!--<beans:ref bean="인터셉터아이디" /> 도 가능-->
	</interceptor>
</interceptors>
Configuration.java
SpringBoot에서처럼 servlet-context.xml을 쓰지 않는 환경에서는 Configuration class를 활용한다. 그 클래스에서 implements WebMvcConfigurer를 받고 public void addInterceptors(InterceptorRegistry registry) 를 오버라이딩하면 된다.
registry에 interceptor를 추가하고, 주소pattern들을 추가한다.
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
	@Autowired
	private 인터셉터클래스 interceptor;
	
	private final List<String> patterns = Arrays.asList("주소", "주소");
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(interceptor).addPathPatterns(patterns);
	}
}
인터셉터 호출 순서
여러 개의 인터셉터가 있다면 servlet-context에 정의한 순서대로 호출된다.

'기록 > BACKEND' 카테고리의 다른 글
| [Spring] MyBatis 설정(feat.Spring) (0) | 2022.04.26 | 
|---|---|
| [WEB] MyBatis 설정 (0) | 2022.04.25 | 
| [Spring] File Download (0) | 2022.04.23 | 
| [Spring] File Upload (0) | 2022.04.22 | 
| [Spring] 예외처리하기 - ControllerAdvice (0) | 2022.04.21 | 
			
			
				
댓글