Spring MVC中的HandlerInterceptors和Filters

news2024/9/28 0:54:33

1.介绍

比较Java servlet过滤器和Spring MVC Handlerinterceptor,以及什么时候一个比另一个更好。

2.Filters

过滤器是web服务器的一部分,而不是Spring框架。对于传入的请求,可以使用过滤器来操作甚至阻止请求到达任何servlet。反之亦然,也可以阻止响应到达客户端。

Spring Security是使用过滤器进行身份验证和授权的一个很好的例子。配置Spring Security。只需要添加一个过滤器,即DelegatingFilterProxy。Spring Security可以拦截所有传入和传出的流量。这就是为什么Spring Security可以在Spring MVC之外使用。

2.1 创建过滤器

要创建一个过滤器,首先,创建一个实现javax.servlet.Filter接口的类:

@Component
public class LogFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(LogFilter.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
  throws IOException, ServletException {
    logger.info("Hello from: " + request.getLocalAddr());
    chain.doFilter(request, response);
}
}	

接下来,重写doFilter方法,在此可以访问或操作ServletRequest、ServletResponse或FilterChain对象。可以使用FilterChain对象允许或阻止请求。
最后,通过使用组件注解将Filter添加到Spring上下文中。剩下的就交给spring了。

3.HandlerInterceptors

处理器拦截器是Spring MVC框架的一部分,位于DispatcherServlet和我们的控制器之间。可以在请求到达控制器之前,以及视图呈现之前和之后拦截请求。

3.1 创建拦截器

为了创建Handlerinterceptor,创建了一个实现org.springframework.web.servlet.Handlerinterceptor接口的类。提供了覆盖三个方法的选项:

  • preHandle() -在调用目标处理程序之前执行

  • postHandle() -在目标处理程序之后执行,但在完成后DispatcherServlet呈现视图之前执行

  • afterCompletion() 在请求处理和视图呈现完成后的回调

    - public class LogInterceptor implements HandlerInterceptor {
      private Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
    
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
        throws Exception {
          logger.info("preHandle");
          return true;
      }
    
      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 
        throws Exception {
          logger.info("postHandle");
      }
    
      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
        throws Exception {
          logger.info("afterCompletion");
      }
      }
    
    
    

4.差异比较

在这里插入图片描述

过滤器在请求到达DispatcherServlet之前拦截请求,这使它们成为粗粒度任务的理想选择,如

  • 身份验证
  • 日志和审计
  • 图像和数据压缩
  • 任何想从Spring MVC中分离出来的功能

另一方面,handlerinterceppors拦截DispatcherServlet和控制器之间的请求。
这是在Spring MVC框架内完成的,提供了对Handler和ModelAndView对象的访问。这减少了重复,并允许更细粒度的功能,如:

  • 处理横切关注点,如应用程序日志记录
  • 详细授权检查
  • 操作Spring上下文或模型

5.总结

关键的收获是使用Filters,可以在请求到达的控制器Spring MVC之外之前操作它们。否则,Handlerinterceptors是应用程序特定横切关注点的好地方。通过提供对目标Handler和ModelAndView对象的访问,拥有了更细粒度的控制

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

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

相关文章

Bootstrap4 总结

文章目录 Bootstrap4 总结概述安装使用CDN使用源码 屏幕尺寸的分割点响应式容器(Containers).container-fluid.container.container-{breakpoint} 网格系统(Gird system)指定列宽实现8列布局 等列宽auto列宽响应式列 响应式工具类display属性其他工具类 组件按钮按钮组轮播图面…

还是搞不懂Anaconda是什么?读这一篇文章就够了

文章目录 1 Anaconda介绍2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源 5 创建虚拟环境并使用5.1 创建虚拟环境5.2 查看所有环境5.3 激活环境5.4 安装包5.4.1 conda方式5.4.2 pip方式5.4.3 从Anaconda.org安装包 5.5 查看该环境的所有包5.6 测试是否安装成功 6 退出…

百分点科技蝉联中国数据治理解决方案市场第二

近日,IDC发布了《中国数据治理市场份额,2022》报告,报告显示,2022年中国数据治理解决方案市场相比2021年增长了7.4%,百分点科技仍然保持领先优势,蝉联数据治理解决方案市场第二。 中国数据治理市场是一个发…

win7 修改粘滞键绕过开机密码(实操步骤详解)

文章目录 win7 使用粘滞键绕过开机密码声明 win7 使用粘滞键绕过开机密码 趁现在还没完全启动关机断电 再次开机选择启动修复 取消系统还原,等待几分钟 查看隐私说明 进入记事本可以打开文件 打开文件可以在C盘修改系统文件 找到粘滞键程序修改名称 找到cm…

leetcode_第17题_缺失的第一个正数——原地哈希

题目 题目 分析 正常思路:另外制作一个哈希表,然后遍历就ok 但是这样不符合题目空间复杂度要求,所以采用原地哈希就可以了。 思路:把正常数字nums[i]交换存储到下标位置为nums[i]-1的地方,不正常数字不管。&#xff…

Rdkit|最大公共子结构

github:地址 文章目录 Rdkit|最大公共子结构rdFMCS.FindMCS参数bondCompareatomComparematchValencesringMatchesRingOnlycompleteRingsOnlymatchChiralTag 高亮分子的不同子结构参考 Rdkit|最大公共子结构 rdFMCS.FindMCS mols: 分子对象maximizeBonds一个结构由…

springboot 获取上传到minio服务器的文件大小

springboot 获取上传到minio服务器的文件大小 前言探究获取文件大小的方法实践及示例 前言 一般minio上传文件,会在上传时拿到文件大小,并保存在数据库中。若想直接从minio上获取,如何获取? 探究获取文件大小的方法 pom依赖 &l…

ubuntu安装nginx

1、apt-get安装nginx 1.1安装最好用root用户安装 不然很多文件权限的报错会让人崩溃 sudo su root apt-get install nginx nginx -v #查看安装版本 service nginx start #启动nginx 1.2查看网页,能看到nginx的页面 1.3核对nginx的文件 find / -name nginx 看…

【UE4 C++】02-编译、生成当前的C++程序

一、编译 编译快捷键: CtrlF7 如果不使用快捷键,可以点击顶部菜单栏中的下拉按钮,然后选择自定义 点击添加命令 点击“生成”,选择编译“”,点击“确定” 此时可以看到顶部菜单栏多了一个用于编译的按钮 二、生成 鼠…

目标百万尼特亮度,这家公司用激光背光提升XR显示技术

​亮度不足一直是AR/VR显示中想要解决的难题之一,目前的AR光源中有多种方案,比如Micro LED、LCoS、DLP等,尽管Micro LED在亮度等方面优势明显,但制造工艺还不成熟。总的来看,目前AR中高亮度解决方案还有很长一段路​要…

Build input file cannot be found: .pch

xcode真机运行时,报错:Build input file cannot be found: /Users/mac/Desktop/projects/xxx/xxx.pch 实际查看发现,项目中的.pch文件存在,但运行时报错。修改配置里的.pch文件路径后,正常。

聊聊用户故事与测试启发

这是鼎叔的第六十六篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。 用户故事的概念于1998年被正式提出,在2001年开始逐步成熟。目前,…

【G431】DAC+DMA输出正弦波

文章目录 前言1.CubeMx的配置步骤3.测试代码4.演示效果 总结 前言 之前有试过用纯的DAC输出正弦波但是效果不是很好,波形不连续,可以很明显的看出断层 之后尝试了DMA传输,发现波形明显变得更加顺滑。 1.CubeMx的配置步骤 下面以主频150MHz…

Avalon总线协议(二)

4.Avalon中断接口 中断接口允许从组件(agent components)能够向主组件(host components)发送事件信号。 例如,DMA控制器可以在完成一个DMA传输后中断处理器。 4.1 中断发送器 中断发送器将单个中断信号驱动到中断接收器。irq信号的时序必须与其相关联时钟的上升…

学位论文查找下载数据库

中文学位论文可去知网、万方查找下载。 外文学位论文可去ProQuest学位论文全文数据库查找下载。 没有知网、万方、ProQuest等数据库使用权限可去文献党下载器使用这些数据库查找下载学位论文。 文献党下载器首页下载客户端,登录客户端进入资源库,在资…

Prometheus 联邦集群配置及应用

目录 前言一、Prometheus 联邦配置1.1 安装 Prometheus1.2 配置 Prometheus 二、Prometheus 联邦验证 前言 什么是 Prometheus 联邦集群?又是在什么样的场景下应用呢?首先,我们知道 Prometheus 是一个强大的监控平台,它是针对容器…

抖音seo源码--矩阵系统开发者日志

这是矩阵系统源码开发者的日志分享,我们致力于为开发者们提供优质的SEO源码。我们研究用户行为、数据分析和搜索引擎算法,以提高内容的搜索排名和曝光度。通过不断优化关键词、元数据和链接策略,我们帮助抖音用户更好地被发现和分享。这个日志…

安卓JNI从0到1入门教程(二)

经过上一篇《安卓JNI从0到1入门教程(一)》介绍,我们对JNI有了初步认识,接下来我会从ndk-build方式和cmake方式分别来介绍怎么构建native库: 一、ndk-build ndk-build依赖配置文件Android.mk,存放代码的位…

机器学习概括

文章目录 一、机器学习是什么?二、模型训练YouTube流量预测1. 先写一个具有未知参数的函数(Function)2. 定义损失(从训练数据进行计算)3.最优化4.结果分析 Back to framework1.带有未知数的函数:2.定义损失…

20.自定义tabBar(使用vant中的tabbar)

自定义tabBar就是不用官方提供的tabBar了,而是自己搞 目录 1 配置 2 使用vant组件库做TabBar 2.1 引入组件 2.2 使用组件 2.3 自定义图标 2.4 把info与store进行绑定 2.5 tab页面的切换 2.6 改变激活状态下的文本颜色 1 配置 首先你需要在项目根…