IDE/Spring Tool Suite

[Spring] SpringBoot + Gradle + Interceptor 개념 및 구현, 소스 예제

한희성 2020. 8. 31.
반응형

[개발환경]


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

댓글

💲 추천 글