フィルターの登録方式
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アノテーションの属性
| 属性名 | 型 | 説明 |
|---|---|---|
| filterName | String | フィルターの識別名を指定します |
| urlPatterns | String[] | フィルターを適用するURLパターンを指定します |
| servletNames | String[] | 対象となるサーブレット名を指定します |
| dispatcherTypes | DispatcherType | フィルター処理の実行タイミングを制御します |
| asyncSupported | boolean | 非同期処理のサポート有無を設定します |
| initParams | WebInitParam[] | 初期化パラメータを設定します |
クロスオリジンリクエスト対応フィルター
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);
}
}