当前位置: 首页 > news >正文

织梦软件网站模板下载地址佛山十大进出口贸易公司

织梦软件网站模板下载地址,佛山十大进出口贸易公司,深圳动漫制作,wordpress用户自定义作者Filter 过滤器详解与使用指南 一、Filter 概述 1.1 什么是 Filter? Filter(过滤器)是 Java Servlet 规范中定义的一种特殊组件,用于在请求到达 Servlet 之前或响应发送到客户端之前拦截和处理 HTTP 请求和响应。Filter 可以看作是…

Filter 过滤器详解与使用指南

一、Filter 概述

1.1 什么是 Filter?

Filter(过滤器)是 Java Servlet 规范中定义的一种特殊组件,用于在请求到达 Servlet 之前或响应发送到客户端之前拦截和处理 HTTP 请求和响应。Filter 可以看作是一个"预处理-后处理"机制。

1.2 Filter 的作用

  • 预处理请求:在请求到达目标资源之前进行处理
  • 后处理响应:在响应发送到客户端之前进行处理
  • 链式处理:多个过滤器可以形成过滤链,依次处理请求和响应

1.3 Filter 的应用场景

  1. 身份认证和授权检查
  2. 请求日志记录和审计
  3. 数据压缩和加密
  4. 字符编码转换
  5. 输入验证和XSS防护
  6. 响应内容过滤和转换

二、Filter 的生命周期

Filter 的生命周期由 Web 容器管理,包含三个阶段:

  1. 初始化:Web 容器启动时,调用 init() 方法
  2. 过滤:每次请求时,调用 doFilter() 方法
  3. 销毁:Web 容器关闭时,调用 destroy() 方法

三、Filter 接口方法

public interface Filter {// 初始化方法,在Filter创建时调用一次void init(FilterConfig filterConfig) throws ServletException;// 过滤处理方法,每次请求都会调用void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;// 销毁方法,在Filter销毁时调用一次void destroy();
}

四、创建和配置 Filter

4.1 创建 Filter 类

// 方式1:实现Filter接口
public class MyFilter implements Filter {private FilterConfig filterConfig;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;System.out.println("MyFilter初始化完成");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 预处理逻辑System.out.println("请求预处理");// 调用过滤链中的下一个过滤器或目标资源chain.doFilter(request, response);// 后处理逻辑System.out.println("响应后处理");}@Overridepublic void destroy() {System.out.println("MyFilter被销毁");this.filterConfig = null;}
}

4.2 配置 Filter

方式1:使用 web.xml 配置(传统方式)
<web-app><!-- 定义Filter --><filter><filter-name>MyFilter</filter-name><filter-class>com.example.MyFilter</filter-class><!-- 初始化参数 --><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><!-- 配置Filter映射 --><filter-mapping><filter-name>MyFilter</filter-name><!-- 匹配所有请求 --><url-pattern>/*</url-pattern><!-- 也可以指定Servlet名称 --><!-- <servlet-name>MyServlet</servlet-name> --><!-- 配置Dispatcher类型 --><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>
</web-app>
方式2:使用注解配置(Servlet 3.0+)
@WebFilter(filterName = "MyFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "encoding", value = "UTF-8")},dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
)
public class MyFilter implements Filter {// 实现代码同上
}

五、FilterChain 机制

FilterChain 代表一个过滤链,多个过滤器按照配置的顺序依次执行:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1. 预处理代码(在chain.doFilter()之前执行)System.out.println("Filter1: 预处理");// 2. 将请求传递给下一个过滤器或目标资源chain.doFilter(request, response);// 3. 后处理代码(在chain.doFilter()之后执行)System.out.println("Filter1: 后处理");
}

六、常见 Filter 应用示例

6.1 字符编码过滤器

@WebFilter(urlPatterns = "/*", initParams = {@WebInitParam(name = "encoding", value = "UTF-8")
})
public class CharacterEncodingFilter implements Filter {private String encoding;@Overridepublic void init(FilterConfig filterConfig) {this.encoding = filterConfig.getInitParameter("encoding");if (this.encoding == null) {this.encoding = "UTF-8";}}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 设置请求和响应编码request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);response.setContentType("text/html;charset=" + encoding);chain.doFilter(request, response);}@Overridepublic void destroy() {// 清理资源}
}

6.2 身份认证过滤器

@WebFilter(urlPatterns = {"/admin/*", "/user/*"})
public class AuthenticationFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;HttpSession session = httpRequest.getSession(false);// 检查用户是否登录boolean isLoggedIn = (session != null && session.getAttribute("user") != null);if (!isLoggedIn) {// 未登录,重定向到登录页面httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.jsp");return;}chain.doFilter(request, response);}
}

6.3 日志记录过滤器

@WebFilter("/*")
public class LoggingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;// 记录请求信息long startTime = System.currentTimeMillis();String requestURI = httpRequest.getRequestURI();String remoteAddr = httpRequest.getRemoteAddr();System.out.println("请求开始: " + requestURI + " from " + remoteAddr);chain.doFilter(request, response);// 记录响应信息long endTime = System.currentTimeMillis();long duration = endTime - startTime;System.out.println("请求完成: " + requestURI + " 耗时 " + duration + "ms");}
}

6.4 XSS 防护过滤器

@WebFilter("/*")
public class XSSFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 包装请求对象,对参数进行XSS过滤XSSRequestWrapper wrappedRequest = new XSSRequestWrapper((HttpServletRequest) request);chain.doFilter(wrappedRequest, response);}
}// XSS请求包装器
class XSSRequestWrapper extends HttpServletRequestWrapper {public XSSRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {String value = super.getParameter(name);return cleanXSS(value);}@Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);if (values == null) return null;String[] cleanedValues = new String[values.length];for (int i = 0; i < values.length; i++) {cleanedValues[i] = cleanXSS(values[i]);}return cleanedValues;}private String cleanXSS(String value) {if (value == null) return null;// 简单的XSS过滤return value.replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#x27;").replaceAll("/", "&#x2F;");}
}

七、Filter 执行顺序

7.1 执行顺序规则

  1. web.xml 配置:按照 <filter-mapping> 的配置顺序执行
  2. 注解配置:按照过滤器类名的字母顺序执行
  3. 混合配置:web.xml 配置的过滤器先于注解配置的过滤器执行

7.2 控制执行顺序

如果需要精确控制执行顺序,可以使用 web.xml 进行统一配置:

<filter-mapping><filter-name>Filter1</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><filter-mapping><filter-name>Filter2</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><filter-mapping><filter-name>Filter3</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

八、DispatcherType 详解

DispatcherType 用于控制过滤器在哪种类型的请求分发过程中被调用:

DispatcherType描述
REQUEST直接来自客户端的请求(默认)
FORWARD通过 RequestDispatcher.forward() 转发的请求
INCLUDE通过 RequestDispatcher.include() 包含的请求
ERROR通过错误页面机制转发的请求
ASYNC异步Servlet处理相关的请求

配置示例

<filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>ERROR</dispatcher>
</filter-mapping>

九、最佳实践

  1. 合理设计过滤链:将通用的、轻量级的过滤器放在前面
  2. 避免重复处理:通过请求属性标记已处理的请求
  3. 正确处理异常:在过滤器中捕获和处理异常
  4. 性能考虑:避免在过滤器中执行耗时操作
  5. 资源清理:在 destroy() 方法中释放资源
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {try {// 预处理// ...chain.doFilter(request, response);// 后处理// ...} catch (Exception e) {// 异常处理throw new ServletException("Filter处理异常", e);}
}

十、总结

Filter 是 Java Web 开发中非常重要的组件,它提供了强大的请求/响应预处理机制。通过合理使用 Filter,可以实现:

  1. 代码复用:将通用功能抽象为过滤器
  2. 职责分离:保持 Servlet 专注于业务逻辑
  3. 灵活配置:通过配置决定过滤器的应用范围和执行顺序
  4. 功能增强:在不修改现有代码的情况下增强系统功能

掌握 Filter 的使用是 Java Web 开发的基本技能,合理运用 Filter 可以大大提高应用程序的可维护性和扩展性。

http://www.dtcms.com/a/495969.html

相关文章:

  • 【JPEG、PNG、WebP:图像格式选择与优化实践】
  • 管理防火墙策略-firewalld、rich rule、iptables
  • 成都外贸建站给别人网站做跳转
  • 征婚网站上拉业务做恒指期货在线制作网站的工具
  • 南县做网站多少钱91福利社区wordpress
  • 云手机和模拟器哪个比较好用
  • 面试_场景_分布式调度系统设计
  • 【C语言】在矩阵中高效查找数字的算法解析
  • 网站在哪里备案信息汉狮做网站公司郑州
  • 求个网站这么难吗2021年自建站
  • 如何在代码中使用唯品会API?
  • 基于skynet框架的一种游戏服登录模块设计
  • MIL、SIL、PIL、HIL、
  • 长沙建站公司网站饮食中心网站建设方案
  • 买外贸服装去哪个网站欧亚专线荷兰快递单号查询
  • 构建AI智能体:六十六、智能的边界:通过偏差-方差理论理解大模型的能力与局限
  • Python编程实战 · 基础入门篇 | 第一个Python程序:Hello World
  • 网站搭建官网深圳苏州企业网站建设服务公司
  • RAG长上下文加速解码策略-meta基于RAG的解决思路浅尝(REFRAG)
  • oracle数据库seg$的type#含义
  • 模式识别与机器学习课程笔记(3):统计决策中的经典学习方法
  • 网站建设提升医院信息化水平大连网站设计九即问仟亿科技
  • QML学习笔记(四十二)QML的MessageDialog
  • 国内专业网站建设公司东莞市建设规划局网站
  • [Linux系统编程——Lesson15.文件缓冲区]
  • 江苏天德建设工程有限公司网站黄冈公司网站建设平台
  • springboot中server.main.web-application-type=reactive导致的拦截器不生效
  • 1688黄页网免费网站做外贸服饰哪个个网站好
  • 杭州做企业网站公司网络营销策略应遵循的原则
  • 对“机器人VCU”进行一个详细、系统的讲解。