Servlet的Filter

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 initing
AFilter initing
//访问Serlvet时的,过滤顺序如下
before invoke BFilter's chain.doFilter() 
before invoke AFilter's chain.doFilter() 
AFilterwrite in MyServlet
after invoke AFilter's chain.doFilter() 
after invoke BFilter's chain.doFilter() 
//卸载WEB应用时,Filter的销毁顺序
BFilter destroy
AFilter destroy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值