• 【JavaWeb】Servlet过滤器


    什么是过滤器

    过滤器是在请求的预处理和后处理时调用的对象。
    主要用于执行转换日志记录压缩加解密输入验证等过滤任务。
    servlet过滤器是可插拔的,即它在web.xml文件中定义,如果从web.xml文件中删除过滤项,则过滤器将被自动删除,因此不需要手动更改Servlet。所以过滤器维护成本会比较低。

    过滤器的使用

    • 记录所有传入的请求
    • 记录来自标计算机的IP地址的请求
    • 转变/转换
    • 数据压缩
    • 加密和解密
    • 输入验证等

    过滤器的优点

    • 过滤器是可插拔的。
    • 一个过滤器不依赖于另一个资源。
    • 维护少,比较容易维护。

    过滤器API

    像Servlet一样,过滤器也有自己的APIjavax.servlet包中包含Filter API的三个接口,它们分别如下所示

    • Filter
    • FilterChain
    • FilterConfig

    Filter接口

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

    方法描述
    public void init(FilterConfig config)init()方法只被调用一次,用于初始化过滤器。
    public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)当用户请求过滤器所映射到资源时,会调用doFilter()方法,它用于执行过滤任务。
    public void destroy()当过滤器从服务中取出时,调用此方法(仅一次)。

    FilterChain接口

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

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

    如何定义过滤器

    我们可以使用与servlet相同方式来定义过滤器。下面来看看过滤器和过滤器映射的元素。在web.xml文件配置如下

    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    对于映射过滤器,可以使用url-patternservlet-nameurl-pattern元素比servlet-name元素具有优势,即它可以应用于servletJSPHTML资源。

    过滤器的示例

    MyFilter.java

    public class MyFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // 设置服务器端的内容类型
            servletResponse.setContentType("text/html");
            // 设置服务器端的编码
            servletResponse.setCharacterEncoding("utf-8");
            // 设置客户端的编码
            servletRequest.setCharacterEncoding("utf-8");
            // 获取服务器端的输出对象
            PrintWriter out = servletResponse.getWriter();
    
            out.println("过滤器调用之前
    "
    ); filterChain.doFilter(servletRequest,servletResponse); out.println("过滤器调用之后
    "
    ); } @Override public void destroy() { } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    MyFilterServlet.java

    public class MyFilterServlet extends HttpServlet {
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            // 设置服务器端编码
            response.setCharacterEncoding("UTF-8");
            // 设置服务器端内容类型
            response.setContentType("text/html;charset=UTF-8");
            // 设置客户端编码
            request.setCharacterEncoding("UTF-8");
            // 获取服务器端输出对象
            PrintWriter out = response.getWriter();
            out.print("  -- 这是一个简单的测试Servlet.
    "
    ); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Filter.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>过滤器的简单示例title>
    head>
    <body>
        <div style="text-align: center">
            <a href="myFilterServlet">查看过滤器调用信息a>
        div>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    web.xml

    
    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             id="WebApp_ID" version="3.1">
        <display-name>ServletRequestdisplay-name>
        <welcome-file-list>
            <welcome-file>Filter.htmlwelcome-file>
        welcome-file-list>
        <servlet>
            <servlet-name>MyFilterServletservlet-name>
            <servlet-class>MyFilterServletservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>MyFilterServletservlet-name>
            <url-pattern>/myFilterServleturl-pattern>
        servlet-mapping>
        <filter>
            <filter-name>MyFilterfilter-name>
            <filter-class>MyFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>MyFilterfilter-name>
            <url-pattern>/myFilterServleturl-pattern>
        filter-mapping>
    <web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    使用sqlmap总是提示需要302跳转重新登录的解决方法
    TCP的三次挥手、四次握手
    流程引擎概述及组成
    C++ 内联函数详解
    pandas连接oracle数据库并拉取表中数据到dataframe中、筛选当前时间(sysdate)到一分钟之前的所有数据(筛选一分钟之内的数据)
    Codeforces-1696 D: Permutation Graph【构造、分治、数据结构】
    QT读取Excel表格内容到Table Widget
    java公立医院绩效考核系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    NewStarCTF2023week2-R!!C!!E!!
    Kafka存取原理与实现分析,打破面试难关
  • 原文地址:https://blog.csdn.net/u013301892/article/details/127568189