728x90
반응형
Interceptor
- 필터와 같이 공통 관심사를 해결 할 수 있는 기술이다.
- 인터셉터는 스프링에서 제공해 주는 기능이다.
- 체인으로 구성되어 여러개를 추가 할 수 있다.
- 서블릿보다 편리하고 더 정교하고 다양한 기능을 지원한다.
Interceptor 동작 방식
Interceptor 흐름
HTTP 요청 ->WAS-> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
Interceptor 제한
- 컨트롤러의 호출 여부를 정 할 수 있다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 // 컨트롤러 접근 허용시
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 종료 // 컨트롤러 접근 허용 안할경우
Interceptor 체인
- 인터셉터를 여러개 정의 할 수 있다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
Interceptor 상세 동작
- 예외가 발생 하면 PostHandle 만 호출 되지 않는다.
Interceptor 인터페이스
preHandle
- 컨트롤러 호출전
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {}
postHandle
- 컨트롤러 호출 후
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {}
afterCompletion
- 요청완료 이후
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {}
Interceptor 예제
- 인터셉터는 호출 시점이 완전히 분리 되어 있다.
- 그래서 변수를 공유 하려면 request 에 값을 담아 둬야 한다.
Interceptor 1 Log
- preHandle: 컨트롤러 호출전에 어트리뷰트에 uuid 를 넣어준다.
- posthandle: 넘어온 modelandview 를 찍는다.
- afterCompletion: 모든 요청이 완료된 후 로그를 찍는다.
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);
//@RequestMapping: HandlerMethod
//정적 리소스: ResourceHttpRequestHandler
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
}
log.info("REQUEST [{}][{}][{}][{}]", uuid, 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("REQUEST [{}][{}][{}][{}]", logId, requestURI, handler);
if (ex != null) {
log.error("afterCompletion");
}
}
}
Interceptor 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/*.ico", "/error");
}
}
Interceptor 2 Login check
- 세션이 없거나 null 일 경우 리다이렉트를 해준다.
- order 를 2 로 하여 동일하게 WebConfig에 등록해준다.
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
//defalult 이기 때문에 원하는 메소드만 오버라이드 해서 쓴다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("인증 체크 인터셉터 실행 {}", requestURI);
HttpSession session = request.getSession();
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER)== null) {
log.info("미인증 사용자 요청");
response.sendRedirect("/login?redirectURL="+requestURI);
return false;
}
return true;
}
}
참고:
728x90
반응형
'Spring > spring mvc 2 스터디' 카테고리의 다른 글
[Spring] 예외 처리 이론 및 기초 (0) | 2022.06.25 |
---|---|
[Spring] Filter Vs Interceptor (0) | 2022.06.01 |
[Spring] Filter (0) | 2022.05.31 |
[Spring] 로그인 처리 세션 (0) | 2022.05.25 |
[Spring] 로그인 처리 쿠키 (0) | 2022.04.16 |
댓글