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

什么是过滤器?为什么要使用过滤器?

1.过滤器的定义

用于对请求和响应进行预处理和后处理的组件。

响应前处理:在请求到达目标资源之前执行。

响应后处理:在响应离开目标资源之后执行。

2.过滤器的意义

1.进行日志记录,例如:

import javax.servlet.*; import java.io.IOException; public class LoggingFilter implements Filter { @Override public void init(FilterConfig filterConfig) { // 可以用来初始化一些资源 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long startTime = System.currentTimeMillis(); // 继续处理请求 chain.doFilter(request, response); long endTime = System.currentTimeMillis(); // 日志打印 System.out.println("Request processed in " + (endTime - startTime) + " ms"); } @Override public void destroy() { // 释放资源 } }

2.用户认证

例如:你在访问淘宝的时候,点击支付商品,会提示你未进行登录,会跳转到登录界面,登录后,才可继续访问。这就是用户认证。

3.请求参数验证

例如:请求打到过滤器上,验证请求参数是否合适,合适就可访问,否则不可访问。就是系统不需要参数为null,但是验证参数为null就不让访问。

4.跨域资源共享 (CORS)

现在的项目几乎为前后端分离,保证项目的可扩展性,易于维护等,此时需要考虑的就是跨域问题,在项目B中进行域名过滤筛选出自己运行的域名(项目A)为可访问,同时避免了其他项目,也就是其他域名的请求(项目C)进行数据的访问

3.如何创建过滤器

1. 实现Filter接口

要创建一个过滤器,需要实现javax.servlet.Filter接口,并重写其主要方法。Filter接口有三个主要方法:

  • init(FilterConfig filterConfig): 初始化方法,在过滤器创建后调用,用于初始化过滤器。
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 核心方法,在请求到达目标资源之前和响应离开目标资源之后被调用。可以在此方法中对请求和响应进行操作。
  • destroy(): 销毁方法,在过滤器销毁之前调用,用于释放资源

2.配置过滤器

在配置文件中配置或者导入对应的jar包启用过滤器,即导包后,编译工具才认识过滤器。

3.过滤器/拦截器:

客户端请求 → [过滤器1 → 过滤器2 → ...] → Servlet容器 → [Spring的DispatcherServlet] → [拦截器1 → 拦截器2 → ...] → 控制器方法 → [返回视图/数据] → [拦截器2后处理 → 拦截器1后处理] → [过滤器2后处理 → 过滤器1后处理] → 响应返回客户端

  1. 你的逻辑需要作用在所有请求上,包括静态资源吗?用过滤器
  2. 你的逻辑需要依赖 Spring 的功能(如依赖注入、AOP)吗?用拦截器
  3. 你需要在控制器方法执行前后做精细控制吗?用拦截器
  4. 你需要修改请求或响应的原始内容(如压缩、编码)吗?用过滤器
  5. 你做的是与 HTTP 协议本身相关的底层处理吗?用过滤器
http://www.jsqmd.com/news/497457/

相关文章:

  • 从明文暴露到安全存储:Keyring彻底解决Python密码管理痛点
  • 2025最完整指南:将Chrome Apps迁移到Android与iOS平台全流程
  • 考公科学刷题方法及资料|错题复盘实用技巧
  • 【问题解决方案】npm install报错问题:npm ERR
  • eclipse的安装,配置以及集成Maven
  • 开源项目推荐:SpoofCheck
  • 开源项目教程:Awesome Stable Diffusion
  • Agent设计模式:Plan-and-Execute
  • NGX-ECHARTS核心功能详解:从基础图表到高级交互
  • 开源项目推荐:Freddy
  • 开源项目《Aviator》安装与使用指南
  • CoGPT 项目使用教程
  • NaughtyKeyboard 项目推荐
  • centos服务器部署流程(前后端部署)
  • RLS历史回顾:Rust IDE工具链的演进之路
  • Open UI5 源代码解析之617:SelectionPanel.js
  • Open UI5 源代码解析之630:PersistenceProvider.js
  • 微型Lisp开源项目指南
  • PDF4QT命令行工具详解:自动化处理PDF文档的实用技巧
  • Fellow Oak DICOM网络通信实战:C-ECHO/C-STORE服务开发与调试全指南
  • The Well与Dedalus集成教程:如何用物理模拟代码生成高质量数据集
  • Open UI5 源代码解析之629:Popup.js
  • 系统颜色选择器:macOS 的色彩控制强化版
  • JRTPLIB项目推荐
  • Oracle 基础
  • Open UI5 源代码解析之628:QueryPanel.js
  • B站自动投稿功能深度解析:gh_mirrors/st/web-server如何实现无缝内容发布
  • C语言入门(占位符)
  • Visual Studio 的C++性能分析工具
  • t-rec-rs:如何用Rust打造超快速终端录制工具,5分钟生成高质量GIF动画