[개발환경]
InteilJ
java 1.8
spring boot 2.3.3
gradle 6.4.1
[인터셉터란 ? (가로채다)]
컨트롤러의 진입 전 들어오는 request , 진이 후 응답하는 responce를 가로채는 역할을 합니다.
user 컨트롤러에는 user 만 접근하게 한다던지, admin 컨트롤러에는 admin 만 접근이 가능하게 한다던지
이런 설정들을 인터셉터에서 행할 수 있습니다. 이런 기능은 필터(filter)기능과 매우 유사한데 두 차이는 분명히 다릅니다.!!
1. 호출 시점의 차이
* 필터는 서블릿이 실행되기 전, 즉 was가 실행되기전에 해당 URL 조건에 따라 필터링을 할 수 있으며,
* 인터셉터는 서블릿 수행 이후 즉, tomcat이 실행 된 이후 동작하기때문에 분명한 차이가 있습니다.
2. 구현
* 필터는 설정에 의해 구현이 되지만, 인터셉터는 설정과 메서드 구현을 직접 해야합니다.
[HandlerInterceptorAdapter 를 상속받아 preHandle, postHandle 메서드를 Override 하여 구현합니다.]
preHandle : request 요청 후 동작, true 또는 false return
- true : 다음 handler 수행(controller), false 수행 x
postHandle : 컨트롤러에 의해 responce 직전에 동작
[WebMvcConfigurationSupport 를 상속받아 Interceptor 들이 동작할 수 있도록 spring 에 등록합니다!]
@Configuration
public class CustomWebMvcConfigurer extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AdminInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/myPage");
registry.addInterceptor(new UserInterceptor())
.addPathPatterns("/user/**");
}
}
* addPathPatterns : 추가할 주소
* excludePathPatterns : 예외 처리할 주소
* 메소드는 체인으로 작성 가능합니다!
* url 패턴 설명 : (맨하단)
* : 1뎁스
** : 1뎁스 그 이상 주소 모든 경로
? : 한개의 글자
public class AdminInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("어드민 컨트롤러 요청 입니다.!!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("어드민 컨트롤러 응답 입니다.!!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("어드민 컨트롤러 응답까지 완료 입니다.");
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("비동기 요청시 수행됩니다, postHandle, afterCompletion 수행 X");
}
}
@RestController
@RequestMapping("/admin")
public class AdminController {
@GetMapping("")
public String index(){
System.out.println("어드민 컨트롤러 입니다.");
return "admin";
}
}
[URL을 패턴으로 제어 해야 할 경우 참고]
@Configuration
public class CustomWebMvcConfigurer extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AdminInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/myPage");
registry.addInterceptor(new UserInterceptor())
.addPathPatterns("/user/?")
.addPathPatterns("/user/*")
.addPathPatterns("/user/**");
}
}
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/t")
public String index0(){
System.out.println("주소 조건이 /user/? 주소가 한글자 일때만 걸립니다.");
return "user";
}
@GetMapping("/tt")
public String index1(){
System.out.println("주소 조건이 /user/* 1뎁스 일때만 걸립니다.");
return "user";
}
@GetMapping("/t/test")
public String index2(){
System.out.println("주소 조건이 /user/** 2뎁스 이상일때 걸립니다.");
return "user";
}
@GetMapping("/ttt/test1/test2/test3")
public String index3(){
System.out.println("주소 조건이 /user/** 2뎁스 이상일때 걸립니다.");
return "user";
}
}
[메소드별 수행 순서]
filter(존재시) > preHandle > controller > postHandle > afterCompletion
* 주소에 대한 권한체크 또는
* 화면 진입전 세션 체크할때 유용하게 사용 가능합니다.
마무리 하겠습니다 !!!!!
git : https://github.com/hhsung0120/interceptor
'IDE > Spring Tool Suite' 카테고리의 다른 글
[STS4] Spring Boot + Gradle Project Open (0) | 2019.05.22 |
---|---|
[STS] logback-spring.xml 설정 (0) | 2018.07.21 |
[STS] lombok 설치 (0) | 2018.07.21 |
[STS] 기본셋팅 항목 (0) | 2018.06.03 |
[STS] POJO 객체 (0) | 2018.06.02 |
댓글