SpringBoot之配置过滤器

  • A+
所属分类:Java片段

过滤器、拦截器的区别

过滤器

提前过滤掉一些请求,或者提前设置一些请求参数,eg. 校验用户是否登录、校验用户是否具有特定权限,统一设置字符集、设置跨域,从cookie中获取用户信息并添加到请求参数中、方便后续使用。

拦截器

面向切面编程的一种体现,在方法调用前后做一些处理,功能上更加强大

过滤器、拦截器的通用场景

记录日志:记录请求信息,以便进行信息监控、信息统计、计算PV(Page View)等
性能监控:记录执行前后的时间,分析耗时

拦截器、过滤器的区别

1、拦截器基于java的反射机制,过滤器基于函数回调

2、拦截器不依赖于servlet容器,过滤器依赖于servlet容器

3、拦截器可以访问servlet、action中的上下文、值栈中的对象,过滤器不可以

4、拦截器可以获取、注入spring容器中的bean,过滤器不行

5、触发时机不一样,过滤器是在请求进入容器后、进入servlet之前进行预处理,在请求结束servlet处理完、返回给前端之前做后处理;拦截器是(业务)方法执行前后做一些处理

执行流程

SpringBoot之配置过滤器
20200831104055885

整合过滤器Filter

Filter类

import javax.servlet.*;
import java.io.IOException;

/**
 * @Description TODO
 * 微信公众号:云说Java、Java栈记
 * @Date 2021/02/14 22:39
 * @Created by moyun
 */

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //.....   //前处理
        chain.doFilter(request, response);
        //......  //后处理
    }


    @Override
    public void destroy() {

    }

}

Filter配置一

//Filter上加
@Component   //放到spring容器中
@WebFilter("/*")   //指定要应用的路径

Filter配置二

//Filter上加
@WebFilter("/*")   //指定要应用的路径


//引导类上加
@ServletComponentScan("com.kjyfx.filter")   //此注解会扫描servlet相关的注解。参数是basePackages,指定filter所在的包
// @ServletComponentScan({"com.kjyfx.filter1", "com.kjyfx.filter2"})   //如果有多个包,写成数组形式

Filter配置三

/**
 * @Description TODO
 * 微信公众号:云说Java、Java栈记
 * @Date 2021/02/14 22:39
 * @Created by moyun
 */


//单独写一个filter的配置类,Filter上无需加注解
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean getFilterRegistrationBean() {
        FilterRegistrationBean filterBean = new FilterRegistrationBean(new MyFilter());
        //配置要应用的路径,如果有多个路径,写成String[]的形式
        filterBean.addUrlPatterns("/*");
        //设置执行顺序,浏览器->服务器时,数值越小的越先执行;服务器->浏览器则相反
        filterBean.setOrder(1);
        return filterBean;
    }
}

@SpringBootApplication本身包含了@Configuration,@Bean部分也可以直接写在引导类中。一个@Bean配置一个Filter,如果要配置多个Filter,需要写多个@Bean。

方式一、二简单,但不好配置多个Filter的执行顺序,

方式三可以配置多个拦截器的执行顺序,但有点麻烦。

  • 云说Java
  • 关注公众号获取更多资源
  • weinxin
  • Java栈记
  • 关注公众号获取更多资源
  • weinxin
墨云

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: