关于拦截器Filter的顺序问题和设置类拦截器的位置问题的验证

 

近来在学习Filter拦截器,@WebFilter中是没有指定顺序的参数,查看了一些博客后再加上验证得到的结果如下:

Filter的拦截顺序是Filter类名的字符比较顺序:

AFilter>BFilter>CFilter;Filter01>Filter02>Filter03

如果几个拦截器的@WebFilter中filterName = "name ",name如果是一样的话,只会执行第一个拦截器

第一个拦截器

@WebFilter(filterName = "Filter1",urlPatterns = "/*")
public class MyFilter1 implements Filter {
    //其他方法忽略

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Myfilter1>>doFilter1");
        chain.doFilter(req,resp);//放行
    }
}

第二个拦截器

@WebFilter(filterName = "Filter2",urlPatterns = "/*")
public class MyFilter1 implements Filter {
    //其他方法忽略

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Myfilter2>>doFilter2");
        chain.doFilter(req,resp);//放行
    }
}

Servlet

@javax.servlet.annotation.WebServlet(name = "Servlet",urlPatterns = "")
public class MyServlet extends javax.servlet.http.HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
        resp.getWriter().write("我是Servlet");
    }
}

其执行结果为:

Myfilter1>>doFilter
Myfilter2>>doFilter2
service

 

 

 

拦截器中如果设置请求/响应字符编码,此拦截器最好为第一个拦截器

@WebFilter(filterName = "Filter1",urlPatterns = "/*")
public class MyFilter1 implements Filter {
    //其他方法忽略

     System.out.println("Myfilter1>>doFilter");
        //设置请求响应字符编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        resp.getWriter().write("我是Filter1:修改字符编码为utf-8
"); resp.getWriter().write("我是MyFilter1"); chain.doFilter(req,resp);//放行 } }

如果请求/响应设置编码的拦截器位于非第一个拦截器,在它之前拦截器中是不能使用请求/响应操作的

@WebFilter(filterName = "Filter1",urlPatterns = "/*")
public class MyFilter1 implements Filter {
    //其他方法忽略

     System.out.println("Myfilter1>>doFilter");

        //此处响应操作使用的非utf-8编码
        //此行代码如果注释掉的话,输出就没有问题了
        resp.getWriter().write("我是MyFilter1");

        chain.doFilter(req,resp);//放行
   }
}
@WebFilter(filterName = "Filter2",urlPatterns = "/*")
public class MyFilter2 implements Filter {
    //其他方法忽略

     System.out.println("Myfilter2>>doFilter");

        //设置请求响应编码为utf-8
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        resp.getWriter().write("我是MyFilter2");

        chain.doFilter(req,resp);//放行
   }
}

上面的两个拦截器后响应输出的中文字符都变成了乱码

你可能感兴趣的:(java)