Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바
- 알고리즘
- springdatajpa
- jpa
- Thymeleaf
- Exception
- Greedy
- java
- http
- 스프링 핵심 원리
- db
- Proxy
- JDBC
- Android
- 그리디
- pointcut
- AOP
- Servlet
- transaction
- 스프링 핵심 기능
- Spring Boot
- 인프런
- 김영한
- JPQL
- 백준
- 스프링
- SpringBoot
- kotlin
- QueryDSL
- spring
Archives
- Today
- Total
개발자되기 프로젝트
[예외] Servlet 예외처리 - interceptor 본문
- 인터셉터 중복 호출 제거
1. LogInterceptor
@Slf4j
public class LogInterceptor implements HandlerInterceptor {
public static final String LOG_ID = "logId";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String uuid = UUID.randomUUID().toString();
request.setAttribute(LOG_ID, uuid);
log.info("REQUEST [{}][{}][{}][{}]", uuid,
request.getDispatcherType(), requestURI, handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle [{}]", modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String logId = (String)request.getAttribute(LOG_ID);
log.info("RESPONSE [{}][{}][{}]", logId, request.getDispatcherType(),
requestURI);
if (ex != null) {
log.error("afterCompletion error!!", ex);
}
}
}
2. LogInterceptor 등록
- 필터의 경우 필터를 등록할 때 어떤 DispatcherType 인 경우에 해당 필터를 적용할 지 선택 가능.
- 인터셉터는 서블릿이 제공하는 기능이 아니라 스프링이 제공하는 기능임.
- DispatcherType 과 무관하게 항상 호출된다.
- 대신 excludePathPathersn에 오류 페이지 경로를 추가하면,
- 오류페이지 요청 시 인터셉터를 호출하지 않을 수 있음.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "*.ico", "/error", "/error-page/**"); //오류페이지 경로
}
}
3. 실행
- 오 interceptor 중복호출 안됨.
- 여기에서 /error-page/** 를 제거하면 error-page/500 같은 내부 호출의 경우에도 인터셉터 호출
4. 전체 흐름 정리
/hello 정상 요청
WAS(/hello, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 -> View
/error-ex 오류 요청
- 필터는 DispatchType 으로 중복 호출 제거 ( dispatchType=REQUEST )
- 인터셉터는 경로 정보로 중복 호출 제거( excludePathPatterns("/error-page/**") )
1. WAS(/error-ex, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러
2. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
3. WAS 오류 페이지 확인
4. WAS(/error-page/500, dispatchType=ERROR) -> 필터(x) -> 서블릿 -> 인터셉터(x) -> 컨트롤러(/error-page/500) -> View
5. GitHub : 210927 Servlet, Exception, intercaptor
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[예외] SpringBoot - BasicErrorController (0) | 2021.09.27 |
---|---|
[예외] SpringBoot - 오류페이지 (0) | 2021.09.27 |
[예외] Servlet 예외처리 - 필터, DispatcherType (0) | 2021.09.27 |
[예외] Servlet 예외처리 - 오류 페이지 작동 원리 (0) | 2021.09.27 |
[예외] Servlet 예외처리 - 오류화면 등록 (0) | 2021.09.27 |
Comments