1.Filter拦截请求
    处理请求 直接给予响应 转发 重定向 放行
    浏览器发出的请求都会经过Filter 前提是配置为/*
    从服务器内部发送出来的请求转发forward,默认是不经过Filter的
    从服务器内部发送出来的请求重定向sendRedirect,默认是会经过Filter的
    image.png
    如果是同一次请求,默认不经过Filter,新请求则会经过。我们可以自行设置

    1. <filter>
    2. <filter-name>one</filter-name>
    3. <filter-class>Filter.FilterOne</filter-class>
    4. </filter>
    5. <filter-mapping>
    6. <filter-name>one</filter-name>
    7. <url-pattern>/*</url-pattern>
    8. <!-- 默认,写不写都可以-->
    9. <dispatcher>REQUEST</dispatcher>
    10. <!-- 设置转发也可以经过Filter;如果想要转发和重定向都经过Filter,两个都要写上-->
    11. <dispatcher>FORWARD</dispatcher>
    12. </filter-mapping>

    2.Filter处理请求
    好多真实资源之前的一个操作 用户认证
    通常拦截pattern / .xxx
    多个Filter都匹配同一个pattern 执行顺序?

    多个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_4_0.xsd"
             version="4.0">
    
        <filter>
            <filter-name>one</filter-name>
            <filter-class>Filter.FilterOne</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>one</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <filter>
            <filter-name>three</filter-name>
            <filter-class>Filter.FilterThree</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>three</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <filter>
            <filter-name>two</filter-name>
            <filter-class>Filter.FilterTwo</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>two</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <servlet>
            <servlet-name>login</servlet-name>
            <servlet-class>controller.LoginController</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>login</servlet-name>
            <url-pattern>/login</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
    package controller;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginController extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            System.out.println("我是真实的目标,取值,调用业务,转发");
            req.getRequestDispatcher("welcome.jsp").forward(req,resp);
        }
    }
    
    package Filter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class FilterOne extends HttpFilter {
        @Override
        protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("FilterOne执行了,放行前");
            chain.doFilter(request,response);
            System.out.println("FilterOne放行后");
        }
    
        @Override
        public void destroy() {
        }
    }
    

    FilterTwo、FilterThree做测试用,除了名字其余都和FilterOne一样

    index.jsp**

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
      </head>
      <body>
        <form action="login" method="post">
          账号:<input type="text" name="username" value=""><br>
          密码:<input type="password" name="password" value=""><br>
          <input type="submit" value="登录">
        </form>
      </body>
    </html>
    

    welcome.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
        <head>
        </head>
        <body>
            welcome!
        </body>
    </html>
    

    运行结果如下
    image.png


    image.png
    **