• 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!!!
  • 相关阅读:
    UVA 11198 Dancing Digits
    UVA 10085 The most distant state
    UVA 321 The New Villa
    UVA 10422 Knights in FEN
    poj2876
    poj2895
    poj2914
    poj2892
    poj2941
    LD SDK LDCControlDll 中 CXMLFile的进一步使用方法,建议以后改进
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15315078.html
Copyright © 2020-2023  润新知