2020. 9. 21. 20:02ㆍJava/Spring
Interceptor
- Spring Framework 강좌에서 배웠던 AOP를 적용한 Spring MVC의 요소다.
- Interceptor는 요청 주소에 대해 관심을 갖고 요청이 발생하게 되면 요청 주소를 확인하여 Controller의 메서드를 호출 하기 전이나 후에 다른 메서드를 호출 할 수 있도록 가로 채 가는 개념이다..
- 요청 발생 시 호출되는 메서드의 코드가 중복 되는 부분이 있을 때 Interceptor를 통해 처리하게 된다.
- 로그인 여부 확인, 등급별 서비스 사용 권한 확인 등의 작업을 처리할 때 많이 사용한다.
Interceptor 구현
- Interceptor는 HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속받은 클래스를 만들고 다음 메서드를 구현한다.
- preHandle : Controller의 메서드가 호출되기 전 호출됩니다. 이 메서드가 false를 반환하면 코드의 흐름이 중단된다.
- postHandle : Controller의 메서드의 수행이 완료되고 view 처리를 수행하기 전에 호출된다.
- afterCompletion : view 처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.
패키지를 새로 생성하고 아래와 같이 HandlerInterceptor를 상속받아 객체를 생성한다.
public class TestInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("TestInterceptor1 - prehandler");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("TestInterceptor1 - postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("TestInterceptor1 - afterCompletion");
}
}
위에서 생성한 interceptor를 등록하기 위해 ServletAppcontext에 메서드를 작성한다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addInterceptors(registry);
TestInterceptor1 inter1 = new TestInterceptor1();
InterceptorRegistration reg1 = registry.addInterceptor(inter1);
reg1.addPathPatterns("/test1");
}
test1의 요청이 들어오면 inter1이 가르키는 인터셉터 클래스가 실행된다.
reg1.addPathPatterns("/test1","/test2");
위 처럼 경로를 추가하면 여러 경로에 대해 interceptor를 수행 가능하다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addInterceptors(registry);
TestInterceptor1 inter1 = new TestInterceptor1();
TestInterceptor2 inter2 = new TestInterceptor2();
TestInterceptor3 inter3 = new TestInterceptor3();
InterceptorRegistration reg1 = registry.addInterceptor(inter1);
InterceptorRegistration reg2 = registry.addInterceptor(inter2);
InterceptorRegistration reg3 = registry.addInterceptor(inter3);
reg1.addPathPatterns("/test1");
reg2.addPathPatterns("/test2");
reg3.addPathPatterns("/test1");
}
위 처럼 여러 인터셉터를 정의하여 사용 가능하다.
pattern
- * : 이름 하나를 의미하며 글자수, 글자 등 제한이 없다.
- ? : 글자하나를 의미한다.
- ** : 하위 이름까지 포함하여 글자수, 글자 등 제한이 없다.
아래와 같이 사용 가능하다.
reg1.addPathPatterns("/*");
reg2.addPathPatterns("/**");
reg3.addPathPatterns("/**/sub");
Pattern 등록
- addPathPatterns, <mapping> : Interceptor가 가로채 갈 주소를 등록한다.
- excludePathPatterns, <exclude-mapping> : Interceptor가 가로채 가지 않을 주소를 등록한다.
reg3.excludePathPatterns("/test1");
위처럼 등록하면 reg3 인터셉터는 test1 경로에 실행이 되지 않는다.
'Java > Spring' 카테고리의 다른 글
Spring MVC - RestController (0) | 2020.09.26 |
---|---|
Spring MVC - 페이지 예외처리 (0) | 2020.09.22 |
Spring MVC - Validator 커스터마이징 (0) | 2020.09.20 |
Spring MVC - JSR-380 어노테이션 정리 (0) | 2020.09.20 |
Spring MVC - JSR-303 어노테이션 정리 (0) | 2020.09.19 |