SpringMVC-快速入门(6.1)- 自定义过滤器、拦截器、验证器

过滤器

依赖于servlet容器过滤的是servlet中的对象,在实现上基于函数回调,可以对几乎所有请求进行过滤。

使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

缺点:一个过滤器实例只能在容器初始化时调用一次。

解决方案:将HttpServletRequest的字节流的数据,保存到一个变量中,重写getInputStream()方法和getReader()方法,从变量中读取数据,返回给调用者。
RepeatableFilter重复读取HttpServletRequest数据

详见 《SpringMVC-快速入门(6.2)- 自定义过滤器

拦截器

依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。拦截的是框架中的对象,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。

由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller 生命周期之内可以多次调用

缺点:只能对 controller 请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

详见《SpringMVC-快速入门(6.3)- 自定义拦截器

应用过滤器和拦截器场景:
SpringBoot+Redis实现后端接口防重复提交校验的示例

区别

  1. 过滤器tomcat服务器创建的对象作用于servlet中的对象,过滤servlet请求响应拦截器SpringMVC容器创建的对象作用于框架中的对象,拦截普通类方法执行
  2. 过滤器实现 Filter 接口,用来设置 request,response参数、属性,侧重对数据的过滤拦截器实现 HandleInterceptor,用来验证请求的,侧重截断请求
  3. 过滤器一个执行时间点拦截器三个执行时间点
  4. 过滤器可以处理jsp、js、html等;拦截器是侧重拦截 Controller 的对象,如果你的请求不能被 DispatcherServlet 接收,这个请求不会执行拦截器的内容。

注:过滤器是在拦截器之前执行的

验证器

SpringMVC-快速入门(五)- 校验数据》说明了springMvc数据校验的用法,如果需要自定义数据验证器,需要实现 ConstraintValidator 接口。大致步骤如下:

  1. 创建验证器注解,指定注解的 @Constraint 为自定义验证器类。
  2. 创建验证器类,实现接口 ConstraintValidator,isValid方法中编写验证器逻辑。
  3. bean类中属性使用验证器注解进行标注。

详见 :
Spring MVC自定义验证
Spring MVC 参数验证3-自定义验证

面试题

拦截器能多次调用,而过滤器只能在容器初始化时被调用一次。如何去理解?

主要原因还是因为拦截器是基于Java的反射机制的,而过滤器是基于函数回调

拦截器就是每次执行到某servlet都会响应所以可以多次,回调函数是调用的时候才会响应。所以,过滤器只有请求在第一次到达服务端进行初始化的时候被调用,所以在整个生命周期只有一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值