什么是过滤器

1 过滤器简介

Filter(过滤器)是对Web资源进行拦截的对象。

通常在过滤器做一些逻辑处理后再交给下一个过滤器或Servlet处理,过滤器一般是用来拦截请求进行处理的,也可以对返回的响应进行拦截处理。

过滤器主要用于执行过滤任务,例如编码转换,日志记录,压缩,加密和解密,输入验证等。

过滤器是可插拔的,即在web.xml文件中定义的,如果我们删除web.xml文件中相应配置,过滤器会被自动删除,我们并不需要改变的Servlet。因此维护成本将更少。

2 过滤器的应用场景

  • 记录所有传入的请求
  • 记录发出请求的计算机的IP地址
  • 字符编码转换
  • 数据压缩
  • 加密和解密
  • 输入验证等

3 过滤器的好处

  1. 过滤器是可插拔的,非常灵活。
  2. 一个过滤器不依赖于另一种资源。
  3. 维护成本低

4 过滤器的API

Filter(过滤器)一样有自己的API。javax.servlet包含Filter API的三个接口。

  1. Filter
  2. FilterChain
  3. FilterConfig

4.1 Filter接口

要创建任何过滤器,必须实现Filter接口。Filter接口提供了Filter的生命周期方法。

方法名称 说明
public void init(FilterConfig config) init()方法仅被调用一次。用于初始化过滤器。
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain) 每当用户请求过滤器拦截到的任何资源时,都会调用doFilter()方法,该方法用于执行过滤任务。
public void destroy() 当从服务中删除过滤器时,仅调用一次。

4.2 FilterChain接口

FilterChainf接口负责调用链中的下一个过滤器或资源。此对象在Filter接口的doFilter方法中传递,FilterChain接口仅包含一个方法:

  1. public void doFilter(HttpServletRequest request,HttpServletResponse response):它将控件传递给下一个过滤器或资源。

5 定义过滤器的语法

接着,让我们看一下如何定义Filter过滤器,主要使用filter和filter-mapping标签:

<web-app>  
  
<filter>  
<filter-name>...</filter-name>  
<filter-class>...</filter-class>  
</filter>  
   
<filter-mapping>  
<filter-name>...</filter-name>  
<url-pattern>...</url-pattern>  
</filter-mapping>  
  
</web-app>  

对于映射过滤器,我们可以使用url-pattern或servlet-name。url-pattern元素比servlet-name元素更有优势,可以应用于Servlet,JSP或HTML。

6 过滤器的案例

6.1 编写页面

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>一点教程网-过滤器案例</title>
    <meta http-equiv="content-type" content="text/html" charset="UTF-8">
</head>
<body>
<a href="servlet1">点击这里</a>
</body>
</html>

6.2 编写需要拦截的Servlet

TargetServlet:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class TargetServlet extends HttpServlet{

    public void doGet(HttpServletRequest req,HttpServletResponse res)
            throws ServletException,IOException
    {
        res.setContentType("text/html;charset=utf-8");
        PrintWriter out = res.getWriter();

        out.print("<br/>这是需要拦截的Servlet资源<br/>");
    }

}

6.3 编写Filter过滤器

MyFilter:

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 *一点教程网 - http://www.yiidian.com
 */
public class MyFilter implements Filter {

    public void init(FilterConfig arg0) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain) throws IOException, ServletException {
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter out=resp.getWriter();
        out.print("在目标资源之前");

        chain.doFilter(req, resp);//请求下一个资源(可能是下一个拦截器,也可能是Servlet等资源)

        out.print("在目标资源之前后");
    }

    public void destroy() {

    }
}

6.4 配置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">

    <servlet>
        <servlet-name>TargetServlet</servlet-name>
        <servlet-class>TargetServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>TargetServlet</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>MyFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/servlet1</url-pattern>
    </filter-mapping>
</web-app>

6.5 运行测试

访问index.jsp,http://localhost:8080/

然后点击,看到以下效果,代表过滤器已经生效啦。

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码