기록/BACKEND

[Spring] Interceptor

5월._. 2022. 4. 24.
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

댓글