본문 바로가기
Spring Boot/etc

[Spring boot] FilterRegistrationBean - url 패턴으로 Filter 설정

by Lee David 2022. 8. 10.
반응형

Rest api 서비스를 만들때에 우리가 외부/내부 서버들과 주고 받는 데이터의 유효성만 확인 되는 것이 첫번째일 것입니다.

하지만 해당 요청에 포함하는 파라미터들의 Encoding 정보를 수정하거나 헤더에 들어있는 정보들의 유효성 등을 Controller에 도달하기 전에 확인 한다면 우리가 중복될 수 있는 유효성 체크 등의 코드를 줄여 나갈 수 있습니다.

FilterRegistrationBean
@Component
@Order(1)
public class CustomFilter implements Filter {

    // Filter 메서드 오버라이드
    @Override
    public void doFilter(
        ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {
        ...
    }
    
    // 추가 메서드 ...
}

프로젝트의 설정 값들을 지정할 때에 @Component 어노테이션으로 class 위에 선언해 주고 Filter를 implements하여 Filter에서 전처리/후처리 메서드들을 오버라이드하여 필터 값을 지정할 수 있습니다.

ServletRequest/Response의 다양한 필터링을 사용할 수 있는 점이 유용하지만 직관성 있는 코드로 구현을 하고자 한다면 FilterRegistrationBean을 사용하는게 더 효율적이라고 생각됩니다.

@Component
public class Filters {
    private CharacterEncodingFilter ansiFilter() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("ANSI");
        filter.setForceEncoding(true);
        return filter;
    }
    
    private CharacterEncodingFilter koreanFilter() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("EUC-KR");
        filter.setForceEncoding(true);
        return filter;
    }

    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> setAnsiFilterBean() {
        FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(ansiFilter());
        registrationBean.addUrlPatterns("/ansi/*");
        return registrationBean;
    }
    
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> setKoreanFilterBean() {
        FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(koreanFilter());
        registrationBean.addUrlPatterns("/korean/*");
        return registrationBean;
    }
}

url들의 encoding 방식들을 제어하는 간단한 예제를 만들어 보았습니다.

헤더 필터링, url 접근 제한등의 필터링도 이러한 방식으로 구현이 가능합니다.

 

반응형