java中的Filter使用示例详解

 更新时间:2025年05月21日 11:02:41   作者:有梦想的攻城狮  
Filter是JavaWeb开发中实现全局逻辑控制的核心工具,通过灵活配置拦截路径和类型,可高效完成编码转换、权限校验、日志记录等通用功能,这篇文章主要介绍了java中的Filter使用详解,需要的朋友可以参考下

Filter(过滤器)是 Java Web 开发的核心组件之一,用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析:

一、Filter 的作用与原理

核心作用
Filter 充当请求与响应之间的“中间层”,主要功能包括:

  • 请求预处理:如统一编码设置、敏感词过滤、权限校验。
  • 响应后处理:如压缩响应内容、添加安全头。
  • 资源拦截控制:根据规则限制对特定资源的访问(如登录校验)。

工作原理

  • 过滤器链:多个 Filter 按配置顺序形成链式处理,请求依次通过每个 Filter,响应则反向传递。
  • 拦截时机:可配置拦截请求类型(如 REQUESTFORWARD)。

二、Filter 的创建与配置

实现 Filter 接口
需实现 javax.servlet.Filter 接口,并重写三个生命周期方法:

public class AuthFilter implements Filter {
    @Override
    public void init(FilterConfig config) { /* 初始化资源 */ }
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
        throws IOException, ServletException {
        // 请求处理逻辑(如权限检查)
        chain.doFilter(req, res); // 放行
        // 响应处理逻辑(如日志记录)
    }
    @Override
    public void destroy() { /* 释放资源 */ }
}

配置方式

XML 配置(web.xml):

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/secure/*</url-pattern>
    <dispatcher>REQUEST</dispatcher> <!-- 拦截请求类型 -->
</filter-mapping>

注解配置(推荐):

@WebFilter(urlPatterns = {"/secure/*"}, initParams = {@WebInitParam(name = "param", value = "value")})
public class AuthFilter implements Filter { /* ... */ }

三、Filter 的生命周期

init() 方法

  • 触发时机:服务器启动时执行一次,用于加载初始化参数或资源(如数据库连接)。
  • 参数:FilterConfig 可获取配置信息(如 <init-param>)。

doFilter() 方法

  • 核心逻辑:每次请求符合拦截路径时执行,需调用 chain.doFilter() 放行。
  • 拦截与修改:可在此修改请求/响应对象(如重写 HttpServletRequestWrapper)。

destroy() 方法

  • 触发时机:服务器关闭时执行,用于释放资源(如关闭线程池)。

四、拦截路径配置详解

URL 匹配模式
• 精确匹配:/login 仅拦截该路径请求。

• 目录匹配:/admin/* 拦截 /admin 下所有子路径。

• 后缀匹配:*.jsp 拦截所有 JSP 请求。

• 全局匹配:/* 拦截所有请求。

拦截类型(Dispatcher)
REQUEST:直接请求(默认)。

FORWARD:拦截转发请求(如 request.getRequestDispatcher().forward())。

ERROR:拦截错误页面跳转。

五、多 Filter 执行顺序

配置顺序规则
• XML 配置:按 <filter-mapping> 定义的顺序执行。

• 注解配置:默认按类名字典序执行(不同容器可能有差异)。

示例流程

请求 → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → 响应

六、典型应用场景

统一编码设置

public class EncodingFilter implements Filter {
    @Override
    public void doFilter(...) {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
}

权限控制

public class LoginFilter implements Filter {
    @Override
    public void doFilter(...) {
        HttpSession session = ((HttpServletRequest) request).getSession();
        if (session.getAttribute("user") == null) {
            ((HttpServletResponse) response).sendRedirect("/login");
        } else {
            chain.doFilter(request, response);
        }
    }
}

日志记录与性能监控

public class LogFilter implements Filter {
    @Override
    public void doFilter(...) {
        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long duration = System.currentTimeMillis() - startTime;
        System.out.println("请求耗时:" + duration + "ms");
    }
}

七、注意事项

线程安全
Filter 实例为单例,避免在类中定义成员变量(若需共享数据,使用 ThreadLocal)。

性能优化
• 减少 doFilter() 中的阻塞操作(如远程调用),必要时结合异步处理。

• 合理设置拦截路径,避免全局拦截导致性能下降。

异常处理
doFilter() 中捕获异常,防止因未处理异常导致过滤器链中断。

总结

Filter 是 Java Web 开发中实现全局逻辑控制的核心工具,通过灵活配置拦截路径和类型,可高效完成编码转换、权限校验、日志记录等通用功能。合理设计过滤器链和执行顺序,能显著提升应用的可维护性和安全性。

到此这篇关于java中的Filter使用示例详解的文章就介绍到这了,更多相关java Filter使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java并发中的内存模型

    浅谈Java并发中的内存模型

    这篇文章主要介绍了Java并发中的内存模型,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 基于Lucene的Java搜索服务器Elasticsearch安装使用教程

    基于Lucene的Java搜索服务器Elasticsearch安装使用教程

    Elasticsearch也是用Java开发的,并作为Apache许可条款下的开放源码发布,能够做到实时搜索,且稳定、可靠、快速,安装使用方便,这里我们就来看一下基于Lucene的Java搜索服务器Elasticsearch安装使用教程:
    2016-06-06
  • SpringBoot实现Tomcat集群的会话管理功能

    SpringBoot实现Tomcat集群的会话管理功能

    在使用 Tomcat 集群时,由于每个 Tomcat 实例的 Session 存储是独立的,导致无法实现 Session 的共享,这可能影响到用户跨节点的访问,为了实现跨 Tomcat 实例共享 Session,可以使用 Spring Session 配合 Redis 进行集中式会话管理,需要的朋友可以参考下
    2024-12-12
  • java图形化界面实现简单混合运算计算器的示例代码

    java图形化界面实现简单混合运算计算器的示例代码

    这篇文章主要介绍了java图形化界面实现简单混合运算计算器的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • SpringBoot实现文章防盗链的代码设计

    SpringBoot实现文章防盗链的代码设计

    这篇文章主要介绍了SpringBoot实现文章防盗链的代码设计,文中通过代码示例讲解的非常详细,对大家实现文章防盗链功能有一定的帮助,需要的朋友可以参考下
    2024-05-05
  • Mybatis-Plus实现公共字段自动赋值的方法

    Mybatis-Plus实现公共字段自动赋值的方法

    这篇文章主要介绍了Mybatis-Plus实现公共字段自动赋值的方法,涉及到通用字段自动填充的最佳实践总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 简述Java中进程与线程的关系_动力节点Java学院整理

    简述Java中进程与线程的关系_动力节点Java学院整理

    在 Java 语言中,对进程和线程的封装,分别提供了 Process 和 Thread 相关的一些类。本文首先简单的介绍如何使用这些类来创建进程和线程
    2017-05-05
  • j2ee mybatis注解@Data,@TableName,@TableField使用方式

    j2ee mybatis注解@Data,@TableName,@TableField使用方式

    这篇文章主要介绍了j2ee mybatis注解@Data,@TableName,@TableField使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • SpringBoot中定位切点的两种常用方法

    SpringBoot中定位切点的两种常用方法

    有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本片文章主要讲解两种在SpringBoot中定位切点的方法,感兴趣的可以了解一下
    2021-06-06
  • SpringBoot中的文件上传和异常处理详解

    SpringBoot中的文件上传和异常处理详解

    这篇文章主要介绍了SpringBoot中的文件上传和异常处理详解,对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息,对于浏览器客户端,响应一个"whitelabel"错误视图,以HTML格式呈现相同的数据,需要的朋友可以参考下
    2023-09-09

最新评论