Springboot过滤器Filter

Filter的说明

过滤器Filter是对目标资源的请求和响应进行拦截,对拦截到的请求和响应做出特殊的功能处理,如用统一处理请求权限,日志记录,敏感信息屏蔽,参数校验等。

Filter的原理

Java过滤器是JavaWeb的三大组件(Filter,Servlet,Listener)之一,Java Servlet API中提供了Filter接口,编写Filter的实现类,从而实现自定义过滤器。Filter的请求流程为:

1 客户端发起请求

2 服务容器判断当前请求资源是否有过滤器,有则执行过滤器

3 过滤器过滤通过后请求到Servlet服务器

4 返回结果通过过滤器返回给请求方

Filter生命周期

看下Filter接口源码

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}

在程序启动时,创建Filter对象,并调用init方法完成Filter初始化,并交由容器管理,常驻内存,在请求发起时,调用doFilter启动对Servlet拦截,过滤通;在程序关闭时调用destroy方法,释放资源,销毁Filter。

Springboot Filter实现

Springboot有两种自定义过滤器的方式

1 @WebFilter和@ServletComponentScan组合使用

如下自定义一个过滤器:

@WebFilter(filterName = "requestFilter")
public class RequestFilter implements Filter {
    /**
     * 实现doFilter方法,
     * 过滤的具体功能在此处处理
     * 
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
    * @throws ServletException
    */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if ((servletRequest).getParameter("OK").equalsIgnoreCase("true")) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

在Springboot启动器中添加@ServletComponentScan即可实现过滤器功能:

@SpringBootApplication
@ServletComponentScan
public class Application {
   public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
   }
}

如果需要添加多个过滤器,只需添加多个实现FIlter功能的过滤器。但是这种方式过滤器过滤顺序只能根据过滤器名的类名顺序执行,添加@Order注解是无效的,原因是@WebFilter在容器加载时,不会使用@Order注解定义的顺序,而是默认直接使用类名排序。所以使用这种方式实现多个过滤器,且有顺序要求,则需要注意类名的定义。

2 实现Filter,通过自定义配置类配置Filter

实现Filter与上面RequestFilter相同,只是不添加@WebFilter,同时启动器也不添加@ServletComponentScan,自定义配置类方式如下:

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Resource
    private RequestFilter requestFilter;

    @Bean
    public FilterRegistrationBean requestFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(requestFilter);
        registration.setName("requestFilter");
        registration.setOrder(1);
        return registration;
    }
}

如果要实现多个过滤器,同时保持自定义顺序,只需对配置文件注册过滤器中的Order改变顺序。注册多个过滤器,只需要在配置类中创建多个Bean。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值