今天我们不谈框架,我们来说说这个 Java 基础中的过滤器和拦截器,为什么要谈呢?其实就有粉丝会问了不起,这个过滤器和拦截器他们有什么区别呢?为什么面试官在面试的时候经常会问到这个过滤器和拦截器的区别,以及他们分别对应的应用场景呢?
今天了不起就来说说这个过滤器和拦截器。
过滤器
过滤器 Filter
什么是过滤器
过滤器是 Servlet 的高级特性之一,是实现 Filter 接口的 Java 类。其基本功能就是对 servlet 的调用进行干预,在 Servlet 请求和响应的过程中增加一些特定的功能。可以使用过滤器实现的功能有:统一编码,URL级别的权限访问控制,过滤敏感词汇,压缩请求信息.
我们来通过代码来看 Filter 的执行过程
在 Filter 中我们可以看到有三个方法,分别是
- init
- doFilter
- destroy
至于每个方法的作用,了不起已经把他们的功能写在了注释上面,他们实际上就是三个步骤:
1.初始化
2.处理请求和相应过滤,完成操作
3.最后释放资源
而实现一个自定义 Filter 也是比较简单的,我们来实现一个简单的自定义的 Filter。
至于 Filter 的配置的话,了不起都不用解释,现在几乎没有再去配置 xml 的方式了,都是配置类或者注解的方式。
注解方式:
配置类方式:
我们看完了这个过滤器,接下来就得看看这个拦截器了。
拦截器
拦截器 Interceptor
什么是拦截器
Spring MVC 中的拦截器Interceptor类似于 ServLet 中的过滤器Filter,它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
老规矩,直接看源代码
其实也是三个步骤:
1.预处理
2.后处理
3.最后执行
至于每一步的含义和内容,了不起同样的再注释中表明了。
同样的,自定义实现一个拦截器也很简单:
我们自定义一个获取并返回某个静态资源的内容以及整个请求所花费的时间拦截器,一般这个还是比较有用的,而且还可以加一个请求访问的,然后来处理方法执行时间的。
配置拦截器其实在项目中是非常的常见。
我们看完了过滤器和拦截器的实现,接下来就得来看看这个过滤器和拦截器之间的区别了。
1.依赖点不同
- 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
- 过滤器属于Servlet,而拦截器属于springmvc
2.实现原理不同
- 过滤器是基于函数回调,而拦截器是基于java的反射机制的
3.作用域不同
- 过滤器则可以对几乎所有的请求起作用,而拦截器只能对action请求起作用
4.生命周期不同
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
这是区别,其实二者的相同点也是有的,比如,拦截器和过滤器实际上都是 Spring 中 AOP 的体现,都能实现一些权限和日志方面的功能。
你知道他们是什么区别了么?