过滤器Filter

定义

对Servlet容器调用Servlet的过程进行拦截,基于函数回调实现

常见使用场景

  • 统一设置编码
  • 过滤敏感字符
  • 登录校验
  • URL级别的访问权限控制
  • 数据压缩

使用方式

这了展示的是SpringBoot整合过滤器的方式,

使用配置类的方式(bean注入)

  • 编写filter类并实现Filter接口,
  • 实现Filter接口中的init,doFilter方法,与destory方法
  • doFilter方法中使用chain.doFilter(request, response);来放行servlet
  • 编写Filter配置类,注解加上@ConFiguration注解
  • 编写方法,返回值类型为FilterRegistrationBean ,
  • 方法内创建FilterRegistrationBean对象,构造器内传入过滤器类的对象,直接new一个就可以,或者让Spring容器自动注入后再使用
  • 调用FilterRegistrationBean 对象的addUrlPatterns方法类设定过滤的请求路径,

过滤器类

@Slf4j//方便使用下面的log.info()方法输出日志
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;log.info("过滤器{}正在生效",LoginCheckFilter.class.getName());log.info("过滤器{}拦截到了请求{}",LoginCheckFilter.class.getName(),request.getRequestURI());filterChain.doFilter(request,response);log.info("请求{}已经被放行",request.getRequestURI());}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("过滤器{}被初始化",LoginCheckFilter.class.getName());Filter.super.init(filterConfig);}@Overridepublic void destroy() {log.info("过滤器{}被销毁",LoginCheckFilter.class.getName());Filter.super.destroy();}
}

配置类

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<LoginCheckFilter> filterRegistrationBean() {FilterRegistrationBean<LoginCheckFilter> loginCheckFilter = new FilterRegistrationBean<>();loginCheckFilter.setFilter(new LoginCheckFilter());//注册自定义过滤器loginCheckFilter.setName("LoginCheckFilter");//过滤器名称loginCheckFilter.addUrlPatterns("/*");//过滤所有路径loginCheckFilter.setOrder(1);//优先级,最顶级按照数据从小到大来执行过滤器return loginCheckFilter;}
}

使用注解@

  • 创建过滤器类,方法与上面创建过滤器类的步骤一样
  • 过滤器类上面添加注解 @WebFilter(urlPatterns = {“拦截路径”}, filterName = “过滤器名称”)
  • 在启动类上添加@ServeltComponentScan注解来扫描servlet组件(包括:@WebFilter和@WebListener)

注意,使用注解方式无法控制多个过滤器的顺序,()默认执行顺序是按照类名字母的排序,

使用@Order注解控制Bean的执行顺序时,必须配合注解一起使用,才会起作用

但是@Component与@WebFilter注解都会把过滤器类加载一遍,并且@component会把@WebFilter加载的Bean覆盖掉,从而使得@WebFilter配置的拦截路径与过滤器名称失效,

所以如果指定了优先级则配置的拦截路径失效,默认为任意路径,如果不使用@Order注解则无法控制多个过滤器的执行顺序,

综上笔者这里推荐使用Bean注入的方式来使用过滤器

总结

  • Filter是依赖于Servlet的,需要导入Servlet的依赖
  • 过滤器会在容器启动时被初始化,并且只会初始化一次
  • doFilter()方法在目标请求被拦截前执行,放行调用filterChain.doFilter(servletRequest,servletResponse);具体变量名根据方法体而变
  • destroy()方法在容器销毁时执行,只执行一次
  • Filter可以拦截所有请求,包括静态资源,
  • 过滤器基于函数回调实现,

扩展

  • 过滤器,监听器和Servlet是JavaWeb三大组件之一,它们的在SpringBoot中的使用方式都差不多区别如下
  • 使用注解方式使用时都需要在启动类加上@ServletComponentScan注解
  • 三个注解为@WebSrvlet,@WebFilter和@Weblistener
  • Servlet类继承的是HttpServlet,Filter实现的是Filter类,Listener实现ServletContextListener类
  • 使用Bean注入方式使用时,Filter组件方法返回类型是FilterRegistrationBean,Listener组件方法返回类型为ServletListenerRefistrationBean,Servlet组件返回类型为ServletRefistrationBean

拦截器Interceptor

定义

类似于Servlet中的过滤器,主要用于拦截用户请求并做相应的处理,基于java反射机制(动态代理)实现

常见使用场景

  • 日志记录
  • 权限校验
  • 登录校验
  • 性能检测[检测方法的执行时间]

其实拦截器和过滤器很像,有些使用场景。无论选用谁都能实现。需要注意的使他们彼此的使用范围,触发机制。

使用方式

  • 编写拦截器类并实现HandlerInterceptor 接口
  • 实现HandlerInterceptor 接口的preHandle,postHandle和afterHandle方法
  • 编写配置类,注意加上@configuration注解,并继承WebMvcConfigurer接口

总结

  • 拦截器依赖于SpringMvc的,需要导入Mvc的依赖
  • preHandle() 在目标请求完成之前执行。有返回值Boolean类型,true:表示放行
  • postHandle() 在目标请求之完成后执行。
  • afterCompletion() 在整个请求完成之后【modelAndView已被渲染执行】。
  • 拦截器只能拦截action请求,不包括静态资源(有待验证)
  • 基于java反射机制实现

版权声明:本文为CSDN博主「Hekliu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liu59412/article/details/122208904

拦截器不生效原因分析

  • 配置类没有加@configuration注解
  • 拦截路径出错,/*拦截当前目录,/**拦截所有目录
  • WebMvcConfigurationSupport,WebMvcConfigurer,WebMvcConfigurerAdapter项目中不能有两个以上的类继承或实现自这三个类 因为这三个类都是WebMVC的配置类,如果同时出现只会有一个类生效,一般实现WebMvcConfilgurer就可以了

过滤器与拦截器的区别

  • 触发顺序不一样,

    • 过滤器的触发顺序在拦截器前,也就是先执行过滤器,在执行拦截器, 过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
    • 过滤器之间的执行顺序嵌套的,
    • 但是拦截器执行顺序也是嵌套执行的但是,因为有三个方法,会先执行pre方法,再一起执行post方法,最后一起执行after方法
    • 实现方式不同,过滤器基于函数回调实现,拦截器基于动态代理(反射)实现
  • 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  • 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
  • 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

aop与过滤器,拦截器的区别

推荐阅读

过滤器,拦截器,aop区别与使用场景_Hekliu的博客-CSDN博客_过滤器和拦截器的区别和使用场景

SpringBoot中使用过滤器_Lyzxii的博客-CSDN博客_springboot 过滤器

过滤器与拦截器的区别_纸上得来终觉浅~的博客-CSDN博客_过滤器和拦截器的区别和使用场景

拦截器与过滤器详解,使用方式与注意事项,使用场景以及区别与联系相关推荐

  1. springboot拦截器与过滤器详解

    前言 不管是传统的ssm项目,还是springboot项目,拦截器和过滤器在项目开发中都离不开,比如说对于ssm框架类的项目来说,许多登录逻辑的前置校验,黑白名单的检查,以及部分请求的数据分析等依然需 ...

  2. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

  3. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解

    一.拦截器简介 Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信 ...

  4. JavaEE基础(05):过滤器、监听器、拦截器,应用详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Listener监听器 1.概念简介 JavaWeb三大组件:Servlet,Listener,Filter.监听器就是指在应用程序中监听 ...

  5. Javaweb入门到实战(三)过滤器、拦截器、jdbc详解

    9.JavaBean 实体类 JavaBean有特定的写法: 必须要有一个无参构造 属性必须私有化 必须有对应的get/set方法: 一般用来和数据库的字段做映射 ORM ORM:对象关系映射 表–& ...

  6. Struts2拦截器(Interceptor)原理详解

    1.    理解拦截器 1.1.    什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作 ...

  7. SpringMVC拦截器-快速入门详解(应用)

    拦截器在预处理后什么情况下会执行目标资源,什么情况下不执行目标资源,以及在有多个拦截器的情况下拦截器的执行顺序是什么? 再编写一个拦截器2, public class MyInterceptor2 i ...

  8. 【vue2】axios请求与axios拦截器的使用详解

  9. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

最新文章

  1. 回归评估+解释方差分
  2. MATLAB实战系列(三十七)-MATLAB基于PQ解耦风电场并网潮流计算
  3. vs2005 2008快捷键
  4. 理解类级别的访问控制权限——类的成员函数可以访问该类所有对象的私有成员
  5. python学习笔记(二)之列表
  6. Android学习之Intent使用
  7. micropython和python区别-MicroPython入坑记(三)板子上的Python到底有多快?
  8. Linux将字符串转化为float,C语言中如何将字符串转换成float和double类型
  9. 快速上手Perl语言
  10. 文字转语音真人发声app哪个好用?几个好用的手机文字转语音软件
  11. resin java_让resin4自动编译java文件
  12. 【千锋】网络安全笔记(总篇)--- 持续更新
  13. 关于IDEA的一些常用的快捷键整合,赶紧进来KK......
  14. ResNet解析(二)
  15. GGSN - SCP 业务控制点
  16. 企业微信如何给客户打标签?
  17. WGS84与GCJ02、BD09经纬度坐标转换介绍
  18. 不知道如何选用笔记本电脑的快来看看
  19. 手绘与码绘的比较---模拟风吹树动
  20. 个人工作SQL整理(大佬勿进)

热门文章

  1. GF(2^8)下查表实现多项式乘法
  2. Writing a Linux Keylogger in C
  3. AVL Cruise和MATLAB DLL联合仿真时快速生成Simulink模型的方法
  4. 计算机考研人工智能方向的学校,北航软件学院首招人工智能方向研究生
  5. 上海交大计算机学院拟录取名单,拟录取名单:上海交通大学各学院2019年研究生拟录取名单...
  6. Ucinet三天写论文!C刊科研网络精写
  7. 二阶龙格库塔公式推导_[常微分方程的数值解法系列五] 龙格-库塔(RK4)法
  8. 获取本小程序的appID
  9. 黑豆文本转语音工具V1.3(有声小说,地摊语音等制作领导者)
  10. 使用鱼骨图构建AS-IS和TO-BE - 过程改进和讨论