본문 바로가기
스파르타 내배캠

[TIL] #30. Filter

by saemsaem 2024. 6. 3.


 

 [ Filter ] 

Filter 란

- 보안, 로깅, 인코딩, 인증인가를 처리할 때 사용된다
- servelt 전에 filter를 거쳐서 전/후처리를 한다. 
   ex) 일정을 요청할 때 - 올바른 사용자인지 체크하는 등 일정 조회 전에 필요한 기능들을 수행함

 

Filter Interface

1. init (초기화) : 처음 구동될 때 필터를 등록해준다

2. dofilter : 실제 필터 기능 로직
  - 요청, 응답, 필터 체인을 호출할 수 있다
  - filterchain 으로 다음 필터를 호출한다

3. destory : 소멸될 때 필터를 제거한다

 

Filter Chain

: 연쇄적으로 흘러간다
 - dofilter에서 filter chain 값을 넘겨서 다음 chain으로 넘긴다

 

Spring Filter

spring filter는 DelegatingFilterProxy, FilterChainProxy를 사용한다.

 

Filter 등록 방법

1. @Configuration
  : filter 관련된 Bean을 모아 관리하는 방법
     - 설정을 위한 별개의 파일이 필요하다.
     - setOrder( ) 를 통해 순서를 정할 수 있다. 
     - addUrlPatterns( ) 를 통해 베이스 URL 및 Whitelist를 설정할 수 있다. 

@Configuration
public class FilterConfiguration {

  /**
   * 로그 관련 필터 추가.
   *
   * @return
   */
  @Bean
  public FilterRegistrationBean loggingFilter() {
    FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
    filterRegistrationBean.setFilter(new LoggingFilter());
    filterRegistrationBean.setOrder(1);
    filterRegistrationBean.addUrlPatterns("/*");

    return filterRegistrationBean;
  }
}

 

2. @Component
     - 설정을 위한 별개의 파일이 필요하지 않다. 
     - @Order 을 이용해 순서를 설정할 수 있다.
     - 기본 URL Pattern이 /* 이며 설정할 수 없다.

@Slf4j
@Component // 추가된 두 가지
@Order(1)  // 추가된 두 가지 
public class LoggingFilter implements Filter {

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
    // 전처리
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    String url = httpServletRequest.getRequestURI();
    log.info(url);

    filterChain.doFilter(servletRequest, servletResponse); // 다음 Filter 로 이동
  }
}

 

3. @WebFilter + @ServletComponentScan
     - 설정을 위한 별개의 파일이 필요하지 않다. (단, 애플리케이션 실행되는 메인 객체 위에 @ServletComponentScan을 사용해야 한다.)
     - @Order 을 이용해 순서를 설정할 수 없다. 
     - @WebFilter의 value나 urlPatterns 파라미터를 통해 whitelist방식으로 베이스 URL을 설정할 수 있다. 

@Slf4j
@WebFilter
public class LoggingFilter implements Filter {

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
    // 전처리
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    String url = httpServletRequest.getRequestURI();
    log.info(url);

    filterChain.doFilter(servletRequest, servletResponse); // 다음 Filter 로 이동
  }
}
@ServletComponentScan
@SpringBootApplication
public class FilterPatternApplication {

  /**
   * main.
   *
   * @param args argument.
   */
  public static void main(String[] args) {
    SpringApplication.run(FilterPatternApplication.class, args);
  }

}

 

4. @WebFilter + @Component
     - 2, 3번째 방법을 모두 사용하는 방법이다. 
     - 설정을 위한 별개의 파일이 필요하지 않다. 
     - @Order을 이용해 순서를 설정할 수 있다. 
     - @WebFilter의 value나 urlPatterns 파라미터를 이용해 베이스 URL이나 whitelist 방식으로 저장할 수 있다. 

@Slf4j
@WebFilter
@Component
@Order(1)
public class LoggingFilter implements Filter {

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
    // 전처리
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    String url = httpServletRequest.getRequestURI();
    log.info(url);

    filterChain.doFilter(servletRequest, servletResponse); // 다음 Filter 로 이동
  }
}

'스파르타 내배캠' 카테고리의 다른 글

[TIL] #32. Spring Security  (0) 2024.06.05
[TIL] #31. @Annotation  (0) 2024.06.04
[TIL] #29. JWT  (0) 2024.06.03
[TIL] #28. 인증/인가  (0) 2024.05.30
[TIL] #27. JWT Util  (0) 2024.05.30