JAVA EE 过滤器

在 Spring Boot 中,使用过滤器(Filter)可以让你在请求和响应处理流程中插入自定义逻辑。过滤器在 Spring Boot 中通常用于处理跨域请求、记录请求日志、进行身份验证、请求参数处理等。

下面是如何在 Spring Boot 中使用过滤器的步骤和示例。

1. 创建一个自定义过滤器

一个过滤器需要实现 javax.servlet.Filter 接口,并重写 doFilter() 方法。

示例代码:

package com.example.demo.filter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

import org.springframework.stereotype.Component;

@Component
public class MyCustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 过滤器初始化(可选)
        System.out.println("MyCustomFilter initialized!");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤器的核心逻辑
        System.out.println("Request is being filtered...");
        
        // 执行请求的下一步(即传递给下一个过滤器或目标资源)
        chain.doFilter(request, response);
        
        // 响应返回时的处理
        System.out.println("Response is being filtered...");
    }

    @Override
    public void destroy() {
        // 过滤器销毁(可选)
        System.out.println("MyCustomFilter destroyed!");
    }
}

说明:

  • init() 方法:在过滤器初始化时调用(可选)。
  • doFilter() 方法:处理过滤器的核心逻辑,可以在此处进行请求的预处理,或者响应的后处理。chain.doFilter() 调用将请求传递到下一个过滤器或目标资源。
  • destroy() 方法:过滤器销毁时调用(可选)。

2. 注册过滤器

Spring Boot 自动扫描所有标注为 @Component 的类,因此如果你的过滤器类加上了 @Component 注解,它会被自动注册为 Spring Bean,并被应用到整个应用程序中。@Component 可以省略,下面的方式也能注册。

通过 FilterRegistrationBean 显式注册过滤器(更灵活)

如果你想控制过滤器的顺序或仅对某些 URL 路径生效,可以通过 FilterRegistrationBean 来显式注册过滤器。

package com.example.demo.config;

import com.example.demo.filter.MyCustomFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<MyCustomFilter> loggingFilter() {
        FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyCustomFilter());
        registrationBean.addUrlPatterns("/api/*");  // 仅对 /api/* 路径的请求生效
        registrationBean.setOrder(1);  // 设置过滤器的执行顺序,数字越小,优先级越高
        return registrationBean;
    }
}

配置说明:

  • setFilter():指定要注册的过滤器。
  • addUrlPatterns():指定过滤器要应用的 URL 路径(支持通配符)。
  • setOrder():设置过滤器的执行顺序。顺序较小的过滤器优先执行,顺序较大的过滤器后执行。

3. 实现跨域请求处理(CORS)

package com.example.demo.filter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

import org.springframework.stereotype.Component;

@Component
public class CORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化过滤器
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 设置CORS头信息
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");

        // 继续执行请求
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁时的逻辑
    }
}

posted @   CyrusHuang  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示