过滤器

过滤器介绍

  • filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行
  • 并且可以对目标资源访问前后进行逻辑处理

🐤过滤器编写步骤

  • 编写一个过滤器的类实现Filter接口
  • 实现接口中尚未实现的方法(重点实现doFilter方法)
  • web.xml中进行配置(主要是配置要对哪些资源进行过滤)
    • 配置filter-class,配置过滤器
    • 配置filter-mapping,对哪些资源进行过滤
  • 代码实现

实现filter接口

public class FirstFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter run");
    }

    public void destroy() {

    }
}

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>filtername</filter-name>
        <filter-class>com.bntang666.filter.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filtername</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

下次启动服务器,客户都访问一个资源的时候,会被过滤器拦截,要在过滤器当中进行放行之后, 才能够访问到对应的Servlet,放行可以通过调用chain.doFilter(req,res)方法,把request、和response传递过去

过滤器的访问流程

  • 在发送一个请求时,web容器会先到filter当中,创建三个参数,res、req、chain
  • 在过滤器当中,放行之后,才能够访问到对应的资源
  • 中间的过滤器可能有多个,在一个过滤器当中,可以调用另外一个过滤器
  • 也有可能过滤器没有拦截所有的资源,有些资源可以直接被访问

Filter生命周期

init

  • 当filter对象创建时调用
    • 当服务器启动时创建
    • 因为有可能一个filter对应多个Servlet
    • 启动时, 先把filter准备好, 访问资源时就可以进行过滤了
  • filterconfig
    • 当前filter对象的配置信息
    • 和servletConfig差不多, 获取名称,参数
    • 获取servletContext对象
    • 先有的ServletContext

dofitter

  • 当匹配到mapping时调用dofilter
  • 参数
    • request
    • response
    • FilterChain
      • 过滤器链对象
      • 内部维护着各个filter的索引,并且知道所有filter的顺序
      • 是根据mapping的顺序来执行的

destroy

  • 当filter对象销毁时调用
    • 关闭服务器时销毁对象
    • 和servletContext的生命周期是一样

配置

mapping

  • 完全匹配
  • 目录匹配
  • 扩展名匹配

servlet_name

  • 可以把路径直接指定某一个servlet
  • 可以有多个servlet_name
  • 开发中基本上使用的都是mapping

dispatcher

  • 配置请求的形式,不是请求方式,是页面跳转的形式
  • 形式分类
    • REQUEST:默认值,代表直接访问某个资源时执行filter
    • ERROR:发生错误时进行跳转时的执行filter
    • INCLUDE:包含资源时执行filter
    • FORWARD:转发时才执行filter,转发之后, 才去执行filter
posted @   BNTang  阅读(75)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示