当前位置: 代码网 > it编程>编程语言>Java > java中的Filter使用示例详解

java中的Filter使用示例详解

2025年05月21日 Java 我要评论
filter(过滤器)是 java web 开发的核心组件之一,用于在请求到达 servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析:一、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使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com