Servlet的Filter

来源:互联网 发布:詹姆斯新秀赛季数据 编辑:程序博客网 时间:2024/06/15 11:22

Filter

用于对用户请求进行预处理或者对响应进行后处理,是个典型的处理链

Filter与Servlet的区别

Filter不能直接向用户生成响应。

完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter的创建

  • 建Filter处理类
  • web.xml文件中配置Filter

在web.xml配置Filter

  • init-param元素:为该Filter配置初始化参数,这里设置的初始值会封装在Filter的init()方法的FilterConfig参数中。

    • param-name子元素:指定参数名。
    • param-value子元素:指定参数值。
  • filter-mapping的在web.xml中的顺序决定Filter的过滤顺序。

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">  <filter>    <filter-name>AFilter</filter-name>    <filter-class>test.AFilter</filter-class>    <init-param>      <param-name>name</param-name>      <param-value>AFilter</param-value>    </init-param>  </filter>  <filter>    <filter-name>BFilter</filter-name>    <filter-class>test.BFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>BFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <filter-mapping>    <filter-name>AFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <servlet>    <servlet-name>MyServlet</servlet-name>    <servlet-class>test.MyServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>MyServlet</servlet-name>    <url-pattern>/MyServlet</url-pattern>  </servlet-mapping></web-app>

MyServlet.java

public class MyServlet extends HttpServlet{    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        System.out.println(req.getAttribute("name")+"write in MyServlet");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req,resp);    }}

AFilter.java

public class AFilter implements Filter{    private FilterConfig config=null;    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("AFilter initing");        this.config=filterConfig;    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        System.out.println("before invoke AFilter's chain.doFilter() ");        HttpServletRequest HservletRequest=(HttpServletRequest)servletRequest;        servletRequest.setAttribute("name",config.getInitParameter("name"));        filterChain.doFilter(servletRequest,servletResponse);        System.out.println("after invoke AFilter's chain.doFilter() ");    }    @Override    public void destroy() {        this.config=null;        System.out.println("AFilter destroy");    }}

BFilter.java

public class BFilter implements Filter{    private FilterConfig config=null;    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("BFilter initing");        this.config=filterConfig;    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        System.out.println("before invoke BFilter's chain.doFilter() ");        filterChain.doFilter(servletRequest,servletResponse);        System.out.println("after invoke BFilter's chain.doFilter() ");    }    @Override    public void destroy() {        this.config=null;        System.out.println("BFilter destroy");    }}

访问该Servlet,在控制台的输出

//Filter在WEB应用加载时就进行了初始化,两个Filter的初始化顺序如下BFilter initingAFilter initing//访问Serlvet时的,过滤顺序如下before invoke BFilter's chain.doFilter() before invoke AFilter's chain.doFilter() AFilterwrite in MyServletafter invoke AFilter's chain.doFilter() after invoke BFilter's chain.doFilter() //卸载WEB应用时,Filter的销毁顺序BFilter destroyAFilter destroy
原创粉丝点击