2021-04-21 08:33  阅读(115)
文章分类:Servlet 简单教程 文章标签:Servlet
©  原文作者:一点教程 原文地址:http://www.yiidian.com/servlet/

1 过滤器简介

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

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

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

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

2021042108311_1.png

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的生命周期方法。

方法名称 说明
publicvoidinit(FilterConfigconfig) init()方法仅被调用一次。用于初始化过滤器。
publicvoiddoFilter(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainchain) 每当用户请求过滤器拦截到的任何资源时,都会调用doFilter()方法,该方法用于执行过滤任务。
publicvoiddestroy() 当从服务中删除过滤器时,仅调用一次。

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/

202104210839_2.png

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

202104210834_3.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 什么是过滤器
上一篇
Servlet的三大域对象
下一篇
编写身份验证过滤器