文章目录
过滤器是什么?
Filter
,即 过滤器 ,是JAVAEE技术规范之一,- 作用目标资源的请求进行过滤的一套技术规范
- 是Java Web项目中最为实用的技术之一
客户端发送请求 先经过filter的doFilter方法,这个方法控制是否放行请求到达目标,
不放行 即 使用filter的方式返回响应给客户端;
放行之后 请求即正常到达目标servlet
放行后 还可以对 响应数据进行处理
一、过滤器概述
-
Filter接口
定义了过滤器的开发规范,所有的过滤器都要实现该接口 -
Filter
的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest
和HttpServletResponse
对象后,会先调用Filter的doFilter
方法 -
Filter的
doFilter
方法可以控制请求是否继续,- 如果放行,则请求继续,
- 如果拒绝,则请求到此为止,由过滤器本身做出响应
-
Filter
不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理 -
Filter是GOF中责任链模式的典型案例
-
Filter的常用应用包括但不限于: 登录权限检查,解决网站乱码,过滤敏感字符,日志记录,性能分析… …
二、过滤器工作位置图解
三、Filter接口API
- 源码
package jakarta.servlet;
import java.io.IOException;
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
- API
API | 目标 |
---|---|
default public void init(FilterConfig filterConfig) | 初始化方法,由容器调用并传入初始配置信息filterConfig对象 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | 过滤方法,核心方法,过滤请求,决定是否放行,响应之前的其他处理等都在该方法中 |
default public void destroy() | 销毁方法,容器在回收过滤器对象之前调用的方法 |
四、过滤器使用
- 创建类 实现
Filter接口
- 重写
doFilter
方法 - 可选择调用放行方法 将请求传下去 :
3.1.filterChain.doFilter(servletRequest, servletResponse);
3.2. 不写此方法 就是不放行请求到目标资源 卡这了
目标:开发一个日志记录过滤器
- 用户请求到达目标资源之前,记录用户的请求资源路径
- 响应之前记录本次请求目标资源运算的耗时
- 可以选择将日志记录进入文件,为了方便测试,这里将日志直接在控制台打印
4.1 定义一个过滤器类,编写功能代码:
package com.doug.filters;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Description:
*/
public class LoggingFilter implements Filter {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//父类转子类 能够使用子类独有的方法
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
//拼接日志
String requestURI = req.getRequestURI();
String time = dateFormat.format(new Date());
String beforeLogging = requestURI + "在" + time + "被请求了";
// 打印日志
System.out.println(beforeLogging);
// 获取系统时间
long t1 = System.