Servlet之Filter过滤器的基本理解

19 篇文章 0 订阅

Filter过滤器

Filter和Servlet一样,本质上也是一个接口,javax.servlet.Filter接口。

当客户端访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

过滤器一般用于完成通用的操作,比如多个资源具有共同的一个操作,可以抽取出来放到过滤器中。比如,登陆验证/统一编码处理/敏感字符过滤等等。

使用步骤:

  • 1,定义一个类,实现Filter接口
  • 2,复写方法
  • 3,配置拦截路径,有两种方式;
    • web.xml
    • 注解配置,@WebFilter("拦截路径"),比如写@WebFilter("/*"),表示访问所有资源之前都会执行该过滤器。

注意,在定义了拦截路径之后,有一个很重要的步骤,就是设置过滤器是否放行。

只有放行了,才能正常访问目标资源。

XML配置拦截路径的方式

过滤器执行流程

  • 请求A资源——执行过滤器中放行之前的代码——执行A资源——A资源执行完成之后返回过滤器,执行放行之后的代码。
  • 通常放行之前对请求消息数据进行一些处理;放行之后对响应消息做一些处理。

过滤器生命周期

  • 始于init方法,终于destroy方法。
  • 服务器启动后创建Filter对象,调用init方法。只会执行一次。
  • 服务器关闭前,Filter对象被销毁。如果是正常关闭的,会执行该方法。只会执行一次。
  • 每一次请求拦截资源时,都会执行doFilter方法。

过滤器拦截路径配置

  • 第一种:具体资源路径。比如/index.jsp,只有执行index.jsp文件时才会执行过滤器。因为过滤器大多用于执行通用操作,所以这种情况用的比较少。
  • 第二种:目录拦截。比如/user/*,表示访问user目录下所有资源时都会执行过滤器。假如我想在指定的几个资源前都会执行过滤器,那么我可以给这几个资源的资源路径加上同一个父目录(即多层资源路径),然后再用目录拦截,即可。
  • 第三种:后缀名拦截。比如*.jsp,表示访问所有后缀名为.jsp的资源时都会执行过滤器。注意这种方式没有正斜杠/。
  • 第四种:拦截所有。/*,表示访问所有资源前都会执行过滤器。

过滤器拦截方式配置

  • 拦截方式是指资源被访问的方式,是直接访问的,还是请求转发访问的等等。
  • 注解配置:设置dispatcherTypes属性,有5个值,后三种先了解即可:

REQUEST,默认值。浏览器直接请求资源时执行过滤器。

FORWARD,即访问的资源中存在请求转发这一行为时,才会执行过滤器。假如是直接访问被跳转的资源,而该资源不再跳转到别的资源,就不会执行过滤器。

INCLUDE,包含访问资源。

ERROR,错误跳转资源。

ASYNC,异步访问资源。

注意,dispatcherTypes是一个数组对象,可以多个属性同时存在,比如:

xml配置:在配置拦截路径的基础上,在路径的下方再配置<dispathcer></dispathcer>即可。

过滤器链

即配置多个过滤器。多个过滤器的执行顺序是:1——2——资源——2——1,即按原路返回。

那么,如果有多个过滤器,先执行哪个过滤器,后执行哪个过滤器呢?

注解配置时会按照类名的字符串比较规则比较,值小的先执行。

xml配置时,谁的<filter-mapping>定义在上面谁先执行。

过滤器链接口FilterChain用于放行,来执行过滤器链中的下一个过滤器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值