Filter 过滤器

    xiaoxiao2021-03-25  44

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


    转载请注明原文地址: https://ju.6miu.com/read-37021.html

    最新回复(0)