mini_project/회원가입, 로그인 구현하기

[spring] 인터셉터(interceptor)

개발자 배찌 2021. 12. 16. 18:10
728x90

인터셉터

인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 된다.

스프링 MVC를 사용할때, 필터 보다는 인터셉터를 사용하는것이 더 편리하다.

 

**로그 찍는 인터셉터 예시

@Slf4j
public class LogInterceptor implements HandlerInterceptor {
         public static final String LOG_ID = "logId";

         @Override
          public boolean preHandle(HttpServletRequest, HttpServletResponse response, Object handler)
          throws Exception {
                    String requestURI = request.getRequestURI();
                    String uuid = UUID.randomUUID().toString();
                    request.setAttribute(LOG_ID, uuid);

                   if(handler instanceof HandlerMethod) {
                          HandlerMethod hm = (HandleMethod) handler;   
                           //호출할 컨트롤러 메서드의 모든 정보가 포함되어 있음.
                   }
                   return true;
            }  

           @Override
           public boolean 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 , requestURI);
                  
                  if(ex != null) {
                       log.error("afterCompletion error !!! ", ex) ;
                   }
            }
}

 

인터셉터 등록 - WebConfig.java

@Configuration
public class webConfig implements WebMvcConfigurer {
           @Override
           public void addInterceptors(InterceptorRegistry registry){
                    registry.addInterceptor(new LogInterceptor())
                             .order(1)
                             .addPathPatterns("/**")
                             .excludePathPatterns("/css/**", "/*.ico", "/error");
           }
}

 

 

**코드로 찍어보기!! 

Q. 로그인 인증 체크 기능으로 구현해보자.

 

로그인 체크 interceptor - LoginCheckInterceptor

**인증이라는 것은 컨트롤러 호출 전에만 호출되면 된다. 따라서 preHandle만 구현하면 된다.

@Slf4j
public class LogInterceptor implements HandlerInterceptor {
         @Override
          public boolean preHandle(HttpServletRequest, HttpServletResponse response, Object handler)
          throws Exception {
                    String requestURI = request.getRequestURI();
                    log.info("인증체크 인터셉터 실행 {}", requestURI);
                    HttpSession session = request.getSessionI(false);

                    if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
                              log.info("미인증 사용자 요청");
                              //로그인으로 redirect
                              response.sendRedirect("/login?redirectURL=" + requestURI);
                              return false;
                    }
                    return true;             
            }  
}

인터셉터 등록 - WebConfig.java에 추가

@Configuration
public class webConfig implements WebMvcConfigurer {
           @Override
           public void addInterceptors(InterceptorRegistry registry){
                    registry.addInterceptor(new LogInterceptor())
                             .order(1)
                             .addPathPatterns("/**")
                             .excludePathPatterns("/css/**", "/*.ico", "/error");
           }
}