Filter (一)

来源:互联网 发布:伍迪艾伦 知乎 编辑:程序博客网 时间:2024/06/05 11:58

理解Filter的执行顺序。

我们可以在web.xml中定义多个Filter,顺序很重要,从上往下的顺序。doFilter方法中的chain.doFilter(request, response)这一句,就是处理完当前这一句代码之前的代码后,接着处理下一个Filter。

执行顺序如下,假设有N个Filter,这里是三个。

web.xml :


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>TestFilter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>MyServlet</display-name>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.test.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>
  <filter>
    <display-name>Filter1</display-name>
    <filter-name>Filter1</filter-name>
    <filter-class>com.test.Filter1</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Filter1</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>Filter2</display-name>
    <filter-name>Filter2</filter-name>
    <filter-class>com.test.Filter2</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Filter2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>Filter3</display-name>
    <filter-name>Filter3</filter-name>
    <filter-class>com.test.Filter3</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Filter3</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>


servlet如下:



public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这里是处理servlet的代码。");
}


/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}


}


下面是三个Filter:

public class Filter1 implements Filter {


    /**
     * Default constructor. 
     */
    public Filter1() {
        // TODO Auto-generated constructor stub
    }


/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}


/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("------> Filter 1 中  chain.doFilter(request, response) 之前的代码");
chain.doFilter(request, response);
System.out.println("------> Filter 1 中  chain.doFilter(request, response) 之后的代码");
}


/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}


}

-------------------------------------

public class Filter2 implements Filter {


    /**
     * Default constructor. 
     */
    public Filter2() {
        // TODO Auto-generated constructor stub
    }


/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}


/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("------> Filter 2 中  chain.doFilter(request, response) 之前的代码");
chain.doFilter(request, response);
System.out.println("------> Filter 2 中  chain.doFilter(request, response) 之后的代码");
}


/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}


}


------------------------------------

public class Filter3 implements Filter {


    /**
     * Default constructor. 
     */
    public Filter3() {
        // TODO Auto-generated constructor stub
    }


/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}


/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("------> Filter 3 中  chain.doFilter(request, response) 之前的代码");
chain.doFilter(request, response);
System.out.println("------> Filter 3 中  chain.doFilter(request, response) 之后的代码");
}


/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}


}


执行结果如下:

在浏览器中输入http://localhost:8080/TestFilter/MyServlet执行,控制台打印如下:


------> Filter 1 中  chain.doFilter(request, response) 之前的代码
------> Filter 2 中  chain.doFilter(request, response) 之前的代码
------> Filter 3 中  chain.doFilter(request, response) 之前的代码
这里是处理servlet的代码。
------> Filter 3 中  chain.doFilter(request, response) 之后的代码
------> Filter 2 中  chain.doFilter(request, response) 之后的代码
------> Filter 1 中  chain.doFilter(request, response) 之后的代码




0 0
原创粉丝点击