filter(过滤器)是 java web 开发的核心组件之一,用于在请求到达 servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析:
一、filter 的作用与原理
核心作用
filter 充当请求与响应之间的“中间层”,主要功能包括:
- 请求预处理:如统一编码设置、敏感词过滤、权限校验。
- 响应后处理:如压缩响应内容、添加安全头。
- 资源拦截控制:根据规则限制对特定资源的访问(如登录校验)。
工作原理
- 过滤器链:多个 filter 按配置顺序形成链式处理,请求依次通过每个 filter,响应则反向传递。
- 拦截时机:可配置拦截请求类型(如
request、forward)。
二、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使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论