Filter 过滤器

Filter作为javaWeb的三大组件之一,有着其独特的用处。本文将从以下几方面进行讲解。

一:Filter简单创建
二:Filter拦截的方式
三:Filter执行的顺序
四:Filter的应用场景


Filter简单创建
要创建一个过滤器,只需要实现Filter接口。在实现的类中,有

void init(FilterConfig fConfig)
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)``
void destroy()

这样三个方法。
init方法会在服务器开启之后马上调用。
destory方法会在服务器关闭之前调用。
而对于doFilter方法,则会根据其所设定的拦截方式在适当的时候调用。对于默认的拦截方式,也就是request,这时候所谓的适当的时候就是请求服务的时候。在doFilter中的第三个参数,也就是FilterChain chain,此对象只有一个方法chain.doFilter(request, response); 此方法用于转到拦截之前请求的路径。


Fiter的拦截方式
Filter有四种拦截方式,分别为REQUEST(请求,默认) ,FORWARD(转发),INCLUDE(包含),ERROR(出错)的时候拦截。 如果想要设置其他的拦截方式,在配置文件的filter-mapping中加上<dispatcher>FORWARD</dispatcher>, 如下所示(转发的时候拦截)

<filter-mapping>
   .....
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Filter的执行顺序
先看下例子:
有三个Filter实例AFilter,BFilter,CFilter,其对应的doFilter方法分别为:

AFilter:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           System.out.println("AFilter_start");
           chain.doFilter(request, response);
           System.out.println("AFilter_end");
    }
BFilter:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           System.out.println("BFilter_start");
           chain.doFilter(request, response);
           System.out.println("BFilter_end");
    }
CFilter:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("CFilter_start");
        chain.doFilter(request, response);
        System.out.println("CFilter_end");
    }

三个Filter实例在配置文件中的配置filter-mapping的顺序为AFilter,BFilter,CFilter,其中CFilter的拦截方式为FORWARD(转发)。三个Filter都有<url-pattern>/*</url-pattern>
另有两个servlet,分别为AServlet,BServlet.其doGet方法分别为:

AServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("AServlet");
        request.getRequestDispatcher("BServlet").forward(request, response);  
    }
BServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         System.out.println("BServlet");
    }

AServlet会转发到BServlet。

启动服务,当访问AServlet的时候,打印的语句依次为:
这里写图片描述

关于Filter的执行顺序,小结一下:
对于多个Filter,首先看其拦截的方式以及拦截的范围,其不同的方式会在不同的时间点触发。
对于拦截方式相同,拦截的范围相同的,这时候按如下顺序-
根据在配置文件中filter-mapping的顺序,如上例,为AFilter-BFilter-CFilter.其首先会调用AFilter的doFilter的方法,当AFilter的doFilter方法执行到chain.doFilter(request, response),会调用BFilter的doFilter方法,然后调用相应的servlet方法,执行完之后又对应的返回doFilter方法。


Filter的应用场景
一:执行目标资源的时候进行预处理,比如设置程序的编码问题。
二:通过条件判断是否放行–检查用户是否已经登录。
三:在目标资源执行后,做一些后续的处理工作-把目标资源的输出数据进行处理。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值