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