【JavaWeb】过滤器 Filter


过滤器是什么?

  • Filter ,即 过滤器 ,是JAVAEE技术规范之一,
  • 作用目标资源的请求进行过滤的一套技术规范
  • 是Java Web项目中最为实用的技术之一

客户端发送请求 先经过filter的doFilter方法,这个方法控制是否放行请求到达目标,
不放行 即 使用filter的方式返回响应给客户端;
放行之后 请求即正常到达目标servlet
放行后 还可以对 响应数据进行处理


一、过滤器概述

  • Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口

  • Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequestHttpServletResponse对象后,会先调用FilterdoFilter方法

  • Filter的doFilter方法可以控制请求是否继续,

    • 如果放行,则请求继续,
    • 如果拒绝,则请求到此为止,由过滤器本身做出响应
  • Filter不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理

  • Filter是GOF中责任链模式的典型案例

  • Filter的常用应用包括但不限于: 登录权限检查,解决网站乱码,过滤敏感字符,日志记录,性能分析… …

二、过滤器工作位置图解

1

三、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() 销毁方法,容器在回收过滤器对象之前调用的方法

四、过滤器使用

  1. 创建类 实现Filter接口
  2. 重写doFilter方法
  3. 可选择调用放行方法 将请求传下去 :
    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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值