스프링 부트 MVC - Handler Interceptor
OS | Windows 10 PRO 64bit 버전 20H2 (OS 빌드 19042.867) |
Framework | Spring Boot 2.6.6 |
EditTool | Inellij IDEA 2020.1.3 |
BuildTool | Maven |
구조
HanlderInterceptor
preHandle | 컨트롤러 실행 전 수행한다. 반환 값이 true일 경우 컨트롤러로 진입하고 false일 경우 진입하지 않는다. Object handler는 진입하려는 컨트롤러의 클래스 객체가 담겨있다 |
postHandle | 컨트롤러 실행 후 View가 랜더링 되기 전에 수행한다. |
afterCompletion | 컨트롤러 실행되고 view가 랜더링 된 후에 실행된다. |
|
WebMvcConfigurer addInterceptor()
addInterceptor | 적용할 HandlerIntercpor 구현체 클래스 |
addPathPatterns | /*, /**/list, /sign-in 로 매칭하고 해당 url 일 때만 HandlerIntercpor 구현체 적용 |
excludePathPatterns | /*, /**/list, /sign-in 로 매칭하고 해당 url 일 때만 HandlerIntercpor 구현체 적용하지 않음 |
pathMatcher | AntPathMatcher(url) 로 매칭하고 해당 url 일 때만 HandlerInterceptor 구현체 적용 |
order | HanlderInterceptor 순서 적용 |
AntMatcher 참고 url
코드
@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {
private final CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor)
.addPathPatterns("/*")
;
}
}
@Controller
public class TestController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login-do")
public String loginDo() {
return "redirect:board";
}
@GetMapping("/board")
public String board() {
return "board";
}
}
@Slf4j
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("[Controller 진입전]");
log.info("request url -> {}", request.getRequestURL());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
SessionInfo sessionInfo = (SessionInfo) request.getSession().getAttribute("sessionInfo");
log.info("[Controller 진입 후]");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("[View 렌더링 된 후 실행]");
}
}
위 처럼 코드를 짜는 경우 모든 url 에 대해서 CustomIntercepter 를 실행한다
이렇게 된 경우 CustomIntercepter 에서 특정 url 처리를 하지 않는 경우 url 을 돌면서 값이 바뀔 수 있다
공통적으로 처리할 것이 아니라면 config 에서 해당 url 에만 정해준다
@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {
private final CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor)
.addPathPatterns("/login-do")
;
}
}
간단한 구조
HandlerMapping 에서 request 로 넘어온 /login url 이 있는 지 매핑해줌
HandlerAdapter 에서 mapping 된 url 에 맞는 contoller 를 실행
HandlerIntercepter 에서 controller 가 실행 되기 전에 가로채서 실행
Filter, Interceptor, AOP 차이는 아래 참고 바람
참고
'10. Spring > BOOT' 카테고리의 다른 글
11. 스프링 부트 (Spring Boot 2) & 뷰 (Vue 2)- 환경 구축하기 (0) | 2021.03.26 |
---|---|
10. 스프링부트 (Spring Boot 2.4.3) - javax Transactional과 spring Transactional (0) | 2021.03.14 |
09. 스프링 부트 (Spring Boot) - thymeleaf 페이징 처리 Pageable [미완성] (0) | 2020.11.19 |
06. 스프링 부트 (Spring Boot) - 자바 메일 센더 (Java Mail Sender) (0) | 2020.08.29 |
02. 스프링부트 (Spring Boot) Profile, JPA Naming, Exception 전략 (0) | 2020.07.11 |
댓글
이 글 공유하기
다른 글
-
11. 스프링 부트 (Spring Boot 2) & 뷰 (Vue 2)- 환경 구축하기
11. 스프링 부트 (Spring Boot 2) & 뷰 (Vue 2)- 환경 구축하기
2021.03.26 -
10. 스프링부트 (Spring Boot 2.4.3) - javax Transactional과 spring Transactional
10. 스프링부트 (Spring Boot 2.4.3) - javax Transactional과 spring Transactional
2021.03.14 -
09. 스프링 부트 (Spring Boot) - thymeleaf 페이징 처리 Pageable [미완성]
09. 스프링 부트 (Spring Boot) - thymeleaf 페이징 처리 Pageable [미완성]
2020.11.19 -
06. 스프링 부트 (Spring Boot) - 자바 메일 센더 (Java Mail Sender)
06. 스프링 부트 (Spring Boot) - 자바 메일 센더 (Java Mail Sender)
2020.08.29