Spring BootにおけるWebフィルターの実装方法

フィルターの登録方式

Spring BootアプリケーションでWebフィルターを実装する主要な方法として、アノテーションベースの自動スキャン方式と、Javaベースの手動設定方式があります。

アノテーションによる自動登録

@WebFilterアノテーションを使用してフィルターを定義し、@ServletComponentScanでスキャン対象を指定します。

@Slf4j
<strong>@WebFilter(filterName = "securityFilter", urlPatterns = {"/api/*"})</strong>
<strong>@Order(2)</strong>
public class SecurityValidationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) 
            throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        HttpServletResponse httpRes = (HttpServletResponse) res;
        
        // リクエスト処理前のロジック
        log.info("Processing request for: {}", httpReq.getRequestURI());
        
        fc.doFilter(req, res);
        
        // レスポンス処理後のロジック
        log.info("Completed processing for: {}", httpReq.getRequestURI());
    }
}

アプリケーション起動クラスにスキャン設定を追加します。

@SpringBootApplication
<strong>@ServletComponentScan(basePackages = {"com.example.filters"})</strong>
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

プログラムによる手動登録

@Componentアノテーションを付与したフィルターを、FilterRegistrationBeanを使用して登録します。

@Slf4j
<strong>@Component</strong>
public class LoggingFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) 
            throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        fc.doFilter(req, res);
        long duration = System.currentTimeMillis() - startTime;
        log.debug("Request processed in {} ms", duration);
    }
}

設定クラスでフィルターを登録します。

@Configuration
public class WebFilterConfiguration {

    @Autowired
    private LoggingFilter loggingFilter;
    
    @Bean
    public FilterRegistrationBean<LoggingFilter> registerLoggingFilter() {
        FilterRegistrationBean<LoggingFilter> registration = 
            new FilterRegistrationBean<>();
        registration.setFilter(loggingFilter);
        registration.addUrlPatterns("/*");
        registration.setName("loggingFilter");
        <strong>registration.setOrder(10);</strong>
        return registration;
    }
}

@WebFilterアノテーションの属性

属性名説明
filterNameStringフィルターの識別名を指定します
urlPatternsString[]フィルターを適用するURLパターンを指定します
servletNamesString[]対象となるサーブレット名を指定します
dispatcherTypesDispatcherTypeフィルター処理の実行タイミングを制御します
asyncSupportedboolean非同期処理のサポート有無を設定します
initParamsWebInitParam[]初期化パラメータを設定します

クロスオリジンリクエスト対応フィルター

CORS(Cross-Origin Resource Sharing)を有効にするフィルターの実装例です。

@WebFilter(filterName="corsFilter", urlPatterns="/api/*")
public class CorsHeaderFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, 
            FilterChain chain) throws IOException, ServletException {
        
        HttpServletResponse response = (HttpServletResponse) res;
        
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", 
            "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", 
            "Authorization, Content-Type, X-Requested-With");
        response.setHeader("Access-Control-Max-Age", "3600");
        
        chain.doFilter(req, res);
    }
}

タグ: Spring Boot Web Filter CORS Servlet @WebFilter

6月13日 00:39 投稿