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);
  }
}

 

posted @ 2021-09-20 20:06  俊king  阅读(559)  评论(0)    收藏  举报