什么是过滤器
Spring 中不能处理用户请求,但可以用来提供过滤作用的一种Servlet规范。在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。具体则是通过截取用户端的请求与响应信息,并对之进行过滤,即在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容。
过滤器作用
过滤器也能起到拦截请求并作出相应的行动。比如: 可以进行(BA)认证过滤,登陆过滤等。
过滤器实现方式
通过实现Filter接口,也可以通过实现AbstractFilter抽象类。
Filter接口 展开原码
init
初始化操作,FilterConfig用来获取web.xml中关于初始化的配置(init-param)。
doFilter
完成实际的过滤操作, 当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器。
destroy
过滤器销毁时被调用, 即释放过滤器占用的资源。
注意事项: 同一个Url定义多个过滤器时,服务器会按照定义先后顺序组成过滤器链,先后执行filter的doFilter方法。
过滤器和拦截器对比
过滤器(Filter)
|
拦截器(Interceptor)
|
|
---|---|---|
原理 | 基于函数回调 | 基于java的反射机制 |
是否依赖Servlet容器 | 是 | 否 |
是否能访问action上下文、值栈里的对象 | 否 | 是 |
在action的生命周期中,是否多次被调用 | 否,仅在容器初始化时被调用一次 | 是 |
拦截范围 | 所有请求 | 仅能对action请求 |
是否可以获取Ioc容器中的各个bean(是否属于Spring的组件) | 否 | 是,在拦截器里注入一个service,即可以调用业务逻辑。 |
使用范围不同 | 只能用于Web程序中 | 不仅能用于Web中,也可以用于Application、Swing程序中 |
规范不同 | Servlet容器支持的 | Spring容器支持的 |
深度不同 | Servlet前后 | 深入到方法前后、异常抛出前后 |
过滤器和拦截器执行顺序图
相关链接: