spring Framework의 AOP를 적용한 Spring MVC의 요소이다.
Interceptor는 요청주소에 대해 관심을 가지고 있다.
요청주소를 확인하여 Controller의 메서드를 호출 하기 전이나 후에 다른 메서드를 호출 할 수 있도록 가로 채 간다.
메서드의 코드가 중복되는 부분이 있다면 Interceptor를 통해 처리할 수 있다.
로그인 여부 확인, 등급별 서비스 권한 확인 등..
implements HandlerInterceptor
extends HandlerInterceptorAdaptor
2가지 모두 가능하다.
Interceptor는 보통 3가지 메소드를 구현한다.
preHandle() - 메서드 호출 전 (return false이면 이후는 실행하지 않고 종료된다.)
postHandle() - 메서드 호출 후
afterCompletion() - View 처리까지 완료 후
*Interceptor 구현 방법
1. HandlerInterceptor(혹은 HandlerInterceptorAdaptor)를 implements하거나 extends 한 TestInterceptor.java 에 Intercept 할 내용 정의
2. ServletAppContext.java에 addInterceptor 구현하며, TestInterceptor.java 객체 등록 및 경로 지정
1. HandlerInterceptor(혹은 HandlerInterceptorAdaptor)를 implements하거나 extends 한 TestInterceptor.java 에 Intercept 할 내용 정의
<TestInterceptor.java>
//과거에는 추상메소드로 다 개발자가 정의해야 했으나, 이제는 default로 정의되어 있다.
public class TestInterceptor1 implements HandlerInterceptor {
//Controller 메서드 호출 전
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
return true;
}
//Controller 메서드 호출 후
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
//View 처리까지 완료 후
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
2. ServletAppContext.java에 addInterceptor 구현하며, TestInterceptor.java 객체 등록 및 경로 지정하기
//인터셉트를 등록한다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addInterceptors(registry);
TestInterceptor1 inter1 = new TestInterceptor1();
InterceptorRegistration reg1 = registry.addInterceptor(inter1);
//test1에 대한 요청이 오면, Controller로 바로 가지 않고 Interceptor를 들리게 된다.
reg1.addPathPatterns("/test1");
//reg4.addPathPatterns("/test1","/test2");
//reg5.addPathPatterns("/sub1/test3","/sub1/test4");
//reg6.addPathPatterns("/*");
//reg6.addPathPatterns("/sub1/*");
//reg6.addPathPatterns("/**");
//reg6.excludePathPatterns("/*");
}
2개의 페이지에 대해 중복하여 Interceptor를 쓰려면 addPathPatterns("/sub1/test3", "/sub1/test4")를 사용한다.
1개의 "어떠한" 경로에 상관없이 쓰려면 addPathPatterns("/*")을 사용한다.
1개를 넘어서서 몇개의 어디든지의 경로에 추가하고 싶으면 addPathPatterns("/**")을 사용한다.
특정 경로를 제외하고 싶으면 excludePathPatterns("/*")를 사용한다.
즉, 클라이언트 요청 시, 해당 경로가 addInterceptor()에 있으면, TestController.java의 Controller로 바로 가지 않고 먼저 TestController.java에 가서 preHandle을 실행한다.
실행결과순서는 다음과 같다.
===========
preHandle
View 실행
postHandle
afterCompletion
===========
preHandle의 return이 false일 경우
===========
preHandle
===========
*참고
@Controller
public class TestController {
@GetMapping("/test1")
public String test1() {
return "test1";
}
@GetMapping("/test2")
public String test2() {
return "test2";
}
@GetMapping("/sub1/test3")
public String test3() {
return "test3";
}
@GetMapping("/sub1/test4")
public String test4() {
return "test4";
}
}
TestController.java의 내용은 일반적이다. Interceptor와 관련된 설정은 모두 TestInterceptor.java에서 한다.
'Spring > Spring MVC 5' 카테고리의 다른 글
MyBatis (0) | 2020.05.27 |
---|---|
예외처리 (0) | 2020.05.27 |
Validator 커스터마이징 (0) | 2020.05.27 |
JSR-303 / JSR-383 (0) | 2020.05.27 |
에러 메시지 커스터마이징 (0) | 2020.05.27 |