Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链.

web服务器根据Filter在web.xml文件中的注册顺序<mapping>,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法.在doFilter方法中,开发人员如果调用了FilterChain对象doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源.

注意:

    1.FilterChain.doFilter(request,response)它代表的是向下执行,如果下一个还是filter,那么访问这个filter,如果当前filter已经是整个链的末尾,那么访问web资源.

    2.Filter的顺序由<Filter-mapping>的配置顺序决定.

<url-pattern>有几种写法:

    1.完全匹配    必须以"/"开始

    2.可以使用*通配符

        -->1.目录匹配        /a/*        /*        要求必须以"/"开始

        -->2.扩展名匹配

            *.do        *.action    要求,不能以"/"开始,要以*.XXX结束.

扫描二维码关注公众号,回复: 1747233 查看本文章


代码:首先创建一个web project的项目,目录结构如下.


创建一个FirstFilter.java的类文件.

package cn.itcast.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstFilter implements Filter{
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("firstFilter......");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig arg0) throws ServletException {
	}
}

再创建一个secondFilter.java的类文件.

package cn.itcast.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SecondFilter implements Filter{
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("secondFilter......");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig arg0) throws ServletException {
	}
}

然后创建一个DemoServlet的Servlet.

package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DemoServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("demo servlet");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
	}
}

再配置web.xml文件.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
  	<filter-name>firstFilter</filter-name>
  	<filter-class>cn.itcast.web.filter.FirstFilter</filter-class>
  </filter>
  
  <filter>
  	<filter-name>secondFilter</filter-name>
  	<filter-class>cn.itcast.web.filter.SecondFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>firstFilter</filter-name>
  	<url-pattern>/demo</url-pattern>
  </filter-mapping>
  
  <filter-mapping>
  	<filter-name>secondFilter</filter-name>
  	<url-pattern>/demo</url-pattern>
  </filter-mapping>
  
  <servlet>
    <servlet-name>DemoServlet</servlet-name>
    <servlet-class>cn.itcast.web.servlet.DemoServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DemoServlet</servlet-name>
    <url-pattern>/demo</url-pattern>
  </servlet-mapping>
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

在服务器上运行后,访问http://localhost:8080/FilterTest/demo,控制台会输出.




猜你喜欢

转载自blog.csdn.net/superman___007/article/details/80794416