zoukankan      html  css  js  c++  java
  • 9.20JavaWeb之FilterChain过滤器链(Servlet)

    9.20JavaWeb之FilterChain过滤器链(Servlet)

    什么是FilterChain

    再Web应用中部署多个Filter,拦截同一目标资源,组成Filter链(过滤器链)

    特点:

    • 滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。

    FilterChain接口

    • 容器将其实例对象作为参数传入 Filter 对象的 doFilter() 方法中。

    • Filter 对象可以使用 FilterChain 对象调用链中下一个 Filter 的 doFilter() 方法

    • 若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。FilterChain 接口中只有一个方法

    返回值类型方法描述
    void doFilter(ServletRequest request ,ServletResponse response) 使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。

    注意:

    • Filter.doFilter() 方法中调用 FilterChain.doFilter() 方法的语句前后增加某些程序代码,就可以实现例如权限控制、过滤敏感词、设置统一编码格式等功能。

    Filter链拦截过程

     

    注意:

    • 过滤器并不是必须要将请求传递到下一个过滤器或目标资源,它可以自行对请求进行处理,并发送响应给客户端,也可以将请求转发给其他的目标资源。--->也就是说任意一个Filter都可以返回响应结果

    • 过滤器链中的任何一个 Filter 没有调用 FilterChain.doFilter() 方法,请求都不会到达目标资源。

    Filter链Filter的执行顺序

    • web.xml

    • @WebFilter注解


    <filter-mapping> 靠前,则 Filter 先执行,靠后则后执行。

    第一个过滤器类:

    package com.example.HttpServletRequestDemo;

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;

    /**
    * 模拟过滤链的过滤器
    * @since JDK 1.8
    * @date 2021/09/20
    * @author Lucifer
    */
    public class FirstChainFilter implements Filter {
       //设置无参构造器
       public FirstChainFilter(){}

       //销毁对象方法
       @Override
       public void destroy() {
      }

       @Override
       public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
           //设置响应字符集
           resp.setContentType("text/html;charset=UTF-8");
           //创建书写对象
           PrintWriter writer = resp.getWriter();
           //向控制台输出内容
           writer.write("FirstChainFilter对请求进行处理<br />");
           //调用doFilter方法,将对象传递给下一个过滤器
           chain.doFilter(req, resp);
           //输出信息
           writer.write("FirstChainFilter对响应进行处理<br />");
      }

       //初始化方法
       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
      }
    }

    第二个过滤器类:

    package com.example.HttpServletRequestDemo;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    /**
    * 二次访问Servlet的类
    * @since JDK 1.8
    * @date 2021/09/20
    * @author Lucifer
    */
    @WebServlet(name = "SecondTimeServlet", value = "/SecondTimeServlet")
    public class SecondTimeServlet extends HttpServlet {
       //设置UID
       private static final long serialVersionUID = 1L;

       //Get
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //设置响应字符集
           resp.setContentType("text/html;charset=UTF-8");
           //打印内容
           PrintWriter writer = resp.getWriter();
           //session当中获取上次访问的时间
           String value = (String) req.getSession().getAttribute("lastTime");
           //不是第一次访问
           writer.write(
           "<h1>JunkingBoy</h1>"
                   + "<h3>Jun,欢迎您的归来</h3><h3>您上次的时间是" + value + "</h3>"
          );
           Date date = new Date();
           //时间的格式
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           //格式化
           String sDate = sdf.format(date);
           //将当前时间赋值到session域对象中
           req.getSession().setAttribute("lastTime", sDate);
      }

       //Post
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doGet(req, resp);
      }
    }

     

    It's a lonely road!!!
  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15315078.html
Copyright © 2011-2022 走看看