반응형

 

 

Spring boot 기준 Filter는 Spring 외부에 있지 않다.

톰캣이 내장되어 Filter도 Di가 가능.

 

 

interceptor는 dispatcher servlet과 controller 사이에서 요청과 응답을 가공, 처리하고자 할 때 사용한다.

 

 

 

interceptor와 filter

filter는 모든 요청과 공통기능에 적용할 사항

interceptor는 선별한 요청과 응답에 대해 적용할 세부 사항

 

 

interceptor 와 AOP

interceptor는 URL을 통해 적용할 메서드를 선별

AOP는 포인트컷을 통해 적용할 메서드를 선별

 

 

 


 

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Login {
    
}

메서드에서 사용할 Login 어노테이션

 

 

 

 


 

 

 

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod hm = (HandlerMethod) handler;

            if (hm.hasMethodAnnotation(Login.class)){
                log.info("true");
                return true;
            }
        }
        log.info("false");
        return false;
    }

LoginInterceptor

인터셉터의 preHandle에서 URL 매핑  메서드에 Login어노테이션이 있는지 확인한다.

 

return true이면 controller로 진입하여 로직을 처리한다.

return false이면 controller로 진입하지 못한다.

 

 

HandlerInterceptor의 메서드

preHandler() - 컨트롤러 로직 처리 전

postHandler() - 컨트롤러 로직 처리 후

afterCompletion() - 뷰가 렌더링된 이후에 호출된다.

예외가 발생하면 postHandler()는 동작하지 않지만, afterCompletion()은 동작한다.

 

Object handler

URL 로 접근하는 매핑된 메서드 

HandlerMethod로 형변환하여 매핑 메서드 정보를 읽어낼 수 있다.

 


 

 

 


@Configuration
public class WebMvc implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor());
    }
}

작성한 LoginInterceptor 인터셉터를 WebMvcConfigurer 에 등록한다.

WebMvcConfigurer는 어플리케이션 구동시 실행된다.

 

 

@Slf4j
@Configuration
public class WebMvc implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")// 적용할 url 패턴
                .excludePathPatterns("/ic/get2")  // 배제할 url 패턴
                .order(1);
    }
}

인터셉터를 적용할 URL 패턴을 적용하고, 제외할 수 있다.

인터셉터의 적용 순서도 적용할 수 있다.

 

URL pattern

/** [ /모든 경로 ] 

ex) user/board/1

 

/*   [ /경로 하나 ] 

ex) /ic , /user, /board

 

 

 


 

@Controller
@RequestMapping("/ic")
public class Icontroller {

    @GetMapping("/get")
    @ResponseBody
    @Login
    public String test(){
        return "hello interceptor";
    }
}

Login체크를 진행할 컨트롤러 메서드에 @Login을 붙여준다.

 


 

 

 

interceptor를 이용한 로직은 목적에 따라 달라질 수 있다.

 

 

 

 

 

 

 

이전에는 Filter가 스프링 컨테이너에 등록되지 않아, Filter에서 DI를 이용하는 것이 불가능 했다.

(Spring boot 기준) Filter 구현체를 Bean으로 등록하므로, 현재는 가능하다.

 

 

@Component
@RequiredArgsConstructor
public class FirstFilter implements Filter {

   private final FilterDiTestService filterDiTestService;

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      System.out.println("필터 동작");
      filterDiTestService.test();
      chain.doFilter(request,response);

   }
}

 

 


 

 

 

 

 

반응형

+ Recent posts