关于过滤器Filter的介绍和使用详解

 更新时间:2025年03月25日 09:58:03   作者:透明果冻  
这篇文章主要介绍了关于过滤器Filter的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.简介

在 Java Web 开发中,Filter 是一个非常重要的组件,用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理或后处理。

Filter 可以用来实现多种功能,如日志记录、权限检查、编码转换、请求头修改等。就好比机场的层层安检,对前来的乘客进行检查过滤,携带违规物品,未买机票等不满足机场要求的就会被阻止进入。

2.Filter 的工作原理

配置:在 web.xml 文件中或使用注解来配置 Filter

  • web.xml中配置
<filter>
    <!--设置filter的别名-->
    <filter-name>LoggingFilter</filter-name>
    <!--filter的字节码路径-->
    <filter-class>com.example.LoggingFilter</filter-class>
</filter>

<filter-mapping>
  	<!--使用filter别名所对应的过滤路径,可以有多个-->
    <filter-name>LoggingFilter</filter-name>
     <!--/*表示对所有路径进行过滤-->
    <url-pattern>/*</url-pattern>
    <!--所要过滤的servlet的别名-->
    <servlet-name>servlet1</servlet-name>
</filter-mapping>

使用注解@WebFilter,它有如下几个常用的值:

  1. filterName: filter的别名相当于标签
  2. urlPatterns:所要过滤的资源url,相当于标签
  3. ServletNames:所要过滤的servlet别名,相当于 servletNames
@WebFilter(
        filterName = "loggingFilter",
        urlPatterns = {"/servlet1","*.html"},
        servletNames = {"servlet1","Servlet2"}
)

拦截

  • 当请求到达时,Filter 会拦截请求,并执行预处理逻辑。
  • 在请求到达目标资源前所执行的一些操作,如检查用户是否有权限访问记录、请求和响应的信息

放行

  • Filter 可以选择是否放行请求到目标资源(如 Servlet)。此时会执行FilterChaindoFilter方法代表放行。
  • FilterChain表示Filter链,若对于该资源,后续还有其他Filter要进行过滤,此时的doFilter方法就会转而执行其他的Filter;若此时没有Filter要进行过滤,那么便会放行,进行目标资源的处理(如,servlet)

后处理

  • 在目标资源(如 Servlet)处理完请求后
  • Filter 可以对响应进行后处理

3.Filter的生命周期

包括初创建始化过滤销毁四个阶段。

阶段对应方法执行时机执行次数
创建对象构造器web应用启动时1次
初始化方法void init(FilterConfig filterConfig)构造完毕1次
过滤请求void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)每次请求多次
销毁default void destroy()web应用关闭时1次

特别注意的的时Filter在web应用启动时就创建了,并且进行初始化,这个过程只会出现一次。

4.Filter的执行顺序

一个web项目中,可以同时定义多个过滤器,当多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链(FilterChain

  • 当使用配置文件进行配置时
  • 过滤器链中的过滤器的顺序由<filter-mapping>标签的定义顺序决定
  • 当使用注解的方式进行配置时
  • 通常会把全部的过滤器放在一个包下,此时,执行顺序为类名的字典排序由小到大依次执行

5.一个简单的Filter的示例

案例要求:

当用户访问资源时,检查其是否进行登陆,若未登录则跳转到登录页, 若以登录则放行

@WebFilter("/*")
public class CheckLoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //向下转型,实现重定向,获得session等功能
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 检查用户是否已登录
        String user = (String) httpRequest.getSession().getAttribute("username");
        if (user == null) {
            // 用户未登录,重定向到登录页面
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
        } else {
            // 用户已登录,放行请求,注意是调用的FilterChain中的doFilter方法!!
            chain.doFilter(request, response);
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 非阻塞I/O使用方法

    Java 非阻塞I/O使用方法

    这篇文章主要介绍了Java 非阻塞I/O使用方法,文中涉及非阻塞I/O的简介,同时向大家展示了利用非阻塞I/O实现客户端的方法,需要的朋友可以参考下。
    2017-09-09
  • Java实现的校验银行卡功能示例

    Java实现的校验银行卡功能示例

    这篇文章主要介绍了Java实现的校验银行卡功能,结合完整实例形式分析了java针对银行卡类型、归属地等信息的判断、读取相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • Java中使用fastjson设置字段不序列化

    Java中使用fastjson设置字段不序列化

    这篇文章主要介绍了Java中使用fastjson设置字段不序列化,alibaba的fasetjson可以设置字段不序列化,使用@JSONField注解的serialize属性,该属性默认是可以序列化的,设置成false就表示不可序列化,需要的朋友可以参考下
    2023-12-12
  • druid配置数据库连接使用密文密码方式

    druid配置数据库连接使用密文密码方式

    这篇文章主要介绍了druid配置数据库连接使用密文密码方式,具有很好的参考价值,希望对大家有所帮助,
    2023-12-12
  • 如何在Java SpringBoot项目中配置动态数据源你知道吗

    如何在Java SpringBoot项目中配置动态数据源你知道吗

    这篇文章主要介绍了SpringBoot如何在运行时动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • Maven Optional依赖属性的含义及妙用

    Maven Optional依赖属性的含义及妙用

    这篇文章主要为大家介绍了Maven Optional依赖属性的含义及妙用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Springboot项目Aop与拦截器与过滤器横向对比

    Springboot项目Aop与拦截器与过滤器横向对比

    前三篇文章已经介绍过Springboot项目如何实现Aop,拦截器和过滤齐功能,这篇文章主要介绍三者的横向对比,本文有一定的参考价值,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • java web监听器统计在线用户及人数

    java web监听器统计在线用户及人数

    本文主要介绍了java web监听器统计在线用户及人数的方法解析。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Spring源码如何修改Bean的属性用到的相关类

    Spring源码如何修改Bean的属性用到的相关类

    这篇文章主要介绍了Spring源码如何修改Bean的属性用到的相关类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring实例化bean的方式代码详解

    Spring实例化bean的方式代码详解

    这篇文章主要介绍了Spring实例化bean的方式代码详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论