过滤器(Filter)和拦截器(Interceptor)的区别

过滤器(Filter)和拦截器(Interceptor)都是用于在请求处理过程中执行额外逻辑的机制,但它们在实现和使用上有一些重要的区别:

过滤器(Filter)

  1. 定义和用途

    • 过滤器主要用于对请求和响应进行预处理和后处理,可以对进入的请求和返回的响应进行修改或处理。
    • 常用于日志记录、认证授权、请求和响应的压缩、字符编码转换等。
  2. 实现和配置

    • 过滤器是基于Servlet规范的,在Servlet API中定义。
    • 需要实现javax.servlet.Filter接口,并在web.xml中配置或使用注解@WebFilter进行配置。
  3. 工作流程

    • 过滤器在Servlet容器启动时被加载,并且在每个请求到达Servlet之前和响应返回客户端之前都会被执行。
    • 过滤器链是通过doFilter方法实现的,过滤器可以选择放行请求或中断请求链。
  4. 作用范围

    • 过滤器在应用程序的所有请求上下文中起作用,包括静态资源(如HTML、CSS、JS文件)和动态资源(如Servlet)。

拦截器(Interceptor)

  1. 定义和用途

    • 拦截器是Spring框架中的一个概念,用于在方法调用前后进行处理,主要用于AOP(面向切面编程)相关功能。
    • 常用于实现权限验证、日志记录、性能监控、事务管理等。
  2. 实现和配置

    • 拦截器需要实现HandlerInterceptor接口,并在Spring配置文件中进行配置,通常是通过继承WebMvcConfigurerAdapter类并重写addInterceptors方法来添加拦截器。
    • 在Spring Boot中,可以通过注解@Configuration和实现WebMvcConfigurer接口来配置。
  3. 工作流程

    • 拦截器在Controller方法执行前后以及视图渲染前被调用。
    • HandlerInterceptor接口提供了三个方法:
      • preHandle:在处理请求之前调用。
      • postHandle:在处理请求之后调用,但在视图渲染之前。
      • afterCompletion:在整个请求完成之后调用。
  4. 作用范围

    • 拦截器仅作用于处理动态资源(如Spring MVC的Controller),不会拦截静态资源。

总结

特性过滤器(Filter)拦截器(Interceptor)
定义和用途基于Servlet规范,用于请求和响应的预处理和后处理基于Spring框架,用于在方法调用前后进行处理
实现和配置实现javax.servlet.Filter接口,配置在web.xml或注解@WebFilter实现HandlerInterceptor接口,在Spring配置中进行配置
工作流程在请求到达Servlet之前和响应返回客户端之前执行在Controller方法执行前后和视图渲染之前执行
作用范围作用于所有请求,包括静态和动态资源仅作用于动态资源(如Spring MVC的Controller)

通过过滤器和拦截器的配合使用,可以对应用程序的请求处理过程进行更加细粒度的控制和管理。

过滤器和拦截器如何拿到请求的参数

过滤器(Filter)

在过滤器中,可以通过HttpServletRequest对象来获取请求参数。HttpServletRequest对象提供了一些方法来获取请求参数,例如:

  • getParameter(String name): 获取单个请求参数的值。
  • getParameterValues(String name): 获取同名请求参数的所有值,返回一个数组。
  • getParameterMap(): 获取所有请求参数,返回一个Map<String, String[]>

示例代码:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String paramValue = httpRequest.getParameter("paramName");// 获取所有参数Map<String, String[]> paramMap = httpRequest.getParameterMap();// 继续处理请求chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
拦截器(Interceptor)

在拦截器中,可以通过HttpServletRequest对象来获取请求参数。HttpServletRequest对象可以通过HandlerInterceptorpreHandle方法中的HttpServletRequest参数获取。

示例代码:

import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String paramValue = request.getParameter("paramName");// 获取所有参数Map<String, String[]> paramMap = request.getParameterMap();// 继续处理请求return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// Do something after the handler is executed}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// Do something after the complete request has finished}
}

总结

  • 过滤器:通过ServletRequest(通常是HttpServletRequest)对象获取请求参数。
  • 拦截器:通过HttpServletRequest对象获取请求参数,通常在preHandle方法中处理。

两者都可以方便地获取和处理请求参数,但拦截器更多用于Spring框架中的请求处理,而过滤器则是基于Servlet规范的,可以用于更广泛的Java Web应用程序中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习编程实战-5 基于时间差分的方法

第4章中&#xff0c;当模型未知时&#xff0c;由于状态转移概率P未知&#xff0c;动态规划中值函数的评估方法不再适用&#xff0c;用蒙特卡洛的方法聘雇值函数。 在蒙特卡洛方法评估值函数时&#xff0c;需要采样一整条轨迹&#xff0c;即需要从初始状态s0到终止状态的整个序列…

[C++ 入门基础 - 函数重载]

在C编程中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;是一种强大的特性&#xff0c;它允许我们定义多个同名函数&#xff0c;但这些函数具有不同的参数列表。通过函数重载&#xff0c;我们可以根据不同的参数类型或数量来实现类似但功能不同的函数&…

探索“搭旅万物皆可搭”小程序——构建旅行搭伴平台的创新实践

摘要 随着旅游市场的不断发展和个性化需求的日益增长&#xff0c;旅行搭伴平台逐渐成为连接志同道合旅者的桥梁。本文旨在介绍“搭旅万物皆可搭”小程序的设计理念、核心功能及其背后的技术实现&#xff0c;探讨如何通过算法优化、安全保障、社交互动等手段&#xff0c;打造一…

GUI界面开发之tkinter(一)

Tkinter是一个内置的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。它提供了一组工具和小部件&#xff0c;用于创建窗口、对话框、按钮、菜单和其他GUI元素。 在本篇文章中&#xff0c;主要介绍了窗口等知识点。 大家好&#xff01;我是码银&#x1…

《昇思25天学习打卡营第22天|onereal》

文本解码原理--以MindNLP为例 回顾&#xff1a;自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 &#x1d44a;_0:初始上下文单词序列&#x1d447;: 时间步当生成EOS标签时&#xff0c;停止生成。 MindNLP/huggi…

人工智能时代的伦理挑战与隐私保护

随着人工智能技术的迅猛发展&#xff0c;我们不得不正视其带来的伦理挑战和隐私保护问题。人工智能的应用已经深入到社会的方方面面&#xff0c;从医疗健康到金融服务&#xff0c;从教育到娱乐&#xff0c;无所不在。然而&#xff0c;与其广泛应用相伴随的是数据隐私泄露、算法…

MySQL 时区问题:设置了 my.ini 并重启了服务,依旧是 0 时区

1、问题再现 在撰写 飞书 API 2-5 时&#xff0c;需要新建一些数据表&#xff0c;以便实施从数据库到多维表的数据同步。我建了2个测试数据表&#xff0c;连表查询之后&#xff0c;将时间戳转为时间格式返回&#xff0c;结果发现少了 8 小时。 具体逻辑抽象为以下&#xff0c…

【Vue3组件】封装全局路由切换loading效果

把大象装进冰箱需要几步 1.写一个全局loading的样式组件&#xff0c;我这里使用了LottieAnimation 实现更优雅的切换动画&#xff0c;详情可以参考主页上一篇文章 <template><div v-if"isLoading" class"loading-overlay"><LottieAnimatio…

S7-1200PLC 2轴直线插补(详细方案对比)

1、V90速度轴应用 速度轴V90PN总线伺服梯形加减速速度控制(标准报文1应用)_v90伺服加减速时间怎么调整-CSDN博客文章浏览阅读288次。SMART PLC斜坡函数SMART PLC斜坡函数功能块(梯形图代码)_RXXW_Dor的博客-CSDN博客斜坡函数Ramp的具体应用可以参看下面的文章链接:PID优化系…

【Linux/Vim】Vim使用教程及速查手册

目录 一.Vim介绍 1.Vim是什么 2.Vim的安装 (1)Vim默认安装的系统 (2)Vim的安装方法 (3)检查Vim是否安装成功 3.Vim,Vi,gvim的区别 4./.vimrc配置文件介绍及使用方法 (1).vimrc 的介绍 (2).vimrc 的使用方法 二.Vim使用方法 1.Vim的模式 (1)Vim一般命令模式常用操作…

【技术】JS的ES6有哪些知识点

1.let-const块级作用域的补充 const names["abc","cba","nba"];for(let i0;i<names.length;i){ //* 这个数组的元素有三个&#xff0c;所以会形成3个块级作用域console.log(names[i]); }以上for遍历内部的实现是以下这样的&#xff1a; 因…

数据库-MySQL 实战项目——书店图书进销存管理系统数据库设计与实现(附源码)

一、前言 该项目非常适合MySQL入门学习的小伙伴&#xff0c;博主提供了源码、数据和一些查询语句&#xff0c;供大家学习和参考&#xff0c;代码和表设计有什么不恰当还请各位大佬多多指点。 所需环境 MySQL可视化工具&#xff1a;navicat&#xff1b; 数据库&#xff1a;MySq…

数据结构之线性表的实现

顺序存储实现&#xff08;数组&#xff09; 顺序存储的线性表通常使用数组来实现。在数组中&#xff0c;元素在内存中是连续存放的&#xff0c;通过数组下标可以访问任意位置的元素。 链式存储实现&#xff08;链表&#xff09; 链式存储的线性表使用链表来实现。链表中的元…

C++ --> 类和对象(三)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 前面已经对类和对象有一定的了解&#xff0c;接下来再次深入的了解一下。 一、深入理解构造函数 构造函数体赋值&#xff1a; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能…

[笔记] SEW的振动分析工具DUV40A

1.便携式振动分析仪 DUV40A 文档编号&#xff1a;26871998/EN SEW是一家国际化的大型的机械设备供应商。产品线涵盖电机&#xff0c;减速机&#xff0c;变频器等全系列动力设备。DUV40A是他自己设计的一款振动分析工具。 我们先看一下它的软硬件参数&#xff1a; 内置两路传…

防火墙综合实验之NAT和智能选路

目录 前言&#xff1a; 一、实验题目 二、实验操作 需求一 需求二 需求三 需求四、需求五 需求六 需求七 ​编辑 需求八 需求九 需求十 需求十一 三、需求测试 前言&#xff1a; 本篇文章是延续上一篇文章&#xff0c;简单来说就是防火墙实验的完善和延续&#…

CV07_深度学习模块之间的缝合教学(2)--维度转换

教学&#xff08;1&#xff09;&#xff1a;链接 1.1 预备知识 问题&#xff1a;假如说我们使用的模型张量是三维的&#xff0c;但是我们要缝合的模块是四维的&#xff0c;应该怎么办&#xff1f; 方法&#xff1a;pytorch中常用的函数&#xff1a;(1)view函数&#xff08;2…

新华三H3CNE网络工程师认证—DHCP使用场景

网络服务与应用当中的技术有DHCP、Telnet和FTP。DHCP是计算机当中常用来获取地址的。比如日常使用中&#xff0c;计算机并没有接入IP&#xff0c;IP通过DHCP技术从上端服务去获取的。手动配置网络参数会出现多种问题。 文章目录 一、手动配置网络参数的问题1、参数多、理解难2、…

【零基础】学JS之APIS第四天

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

喰星云·数字化餐饮服务系统 多处 SQL注入漏洞复现

0x01 产品简介 喰星云数字化餐饮服务系统是一款专为餐饮企业设计的综合性管理软件,旨在通过信息化手段提升餐饮企业的运营效率、降低运营成本,并实现数据驱动的决策管理。该系统包括供应链管理、财务管理、巡店管理、人力资源管理等多个模块,可全面覆盖餐饮企业的日常运营需…