Free Lines Arrow
본문 바로가기
Spring/spring mvc 2 스터디

[Spring] Interceptor

by skahn1215 2022. 6. 1.
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;
    }

}

 

 

 

참고:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/lecture/83353?tab=curriculum&volume=1.00 

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

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

댓글