4.Handler mappings
处理程序映射
简介
在早期版本的 Spring 中,用户需要在 Web 应用程序上下文中定义一个或多个 HandlerMapping
bean 以将传入的 Web 请求映射到适当的处理程序。随着注解控制器的引入,通常不再需要这样做,因为 RequestMappingHandlerMapping
会自动查找所有 @Controller
bean 上的 @RequestMapping
注解。然而,请记住,所有从 AbstractHandlerMapping
扩展的 HandlerMapping
类都具有以下属性,您可以使用这些属性来定制它们的行为:
- interceptors:拦截器列表。
HandlerInterceptors
在第 22.4.1 节“使用HandlerInterceptor
拦截请求”中讨论。 - defaultHandler:当此处理程序映射未能找到匹配的处理程序时使用的默认处理程序。
- order:基于
order
属性的值(参见org.springframework.core.Ordered
接口),Spring 会对上下文中可用的所有处理程序映射进行排序,并应用第一个匹配的处理程序。 - alwaysUseFullPath:如果设置为
true
,Spring 将使用当前 Servlet 上下文中的完整路径来查找适当的处理程序。如果设置为false
(默认值),则使用当前 Servlet 映射中的路径。例如,如果一个 Servlet 使用/testing/*
进行映射,并且alwaysUseFullPath
属性设置为true
,则使用/testing/viewPage.html
,而如果属性设置为false
,则使用/viewPage.html
。 - urlDecode:默认为
true
,从 Spring 2.5 开始。如果您更喜欢比较编码路径,请将此标志设置为false
。然而,HttpServletRequest
始终以解码形式公开 Servlet 路径。请注意,当与编码路径进行比较时,Servlet 路径将不匹配。
以下示例展示了如何配置一个拦截器:
<beans><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"><property name="interceptors"><bean class="example.MyInterceptor"/></property></bean>
</beans>
<beans>
标签用于定义 Spring 应用上下文的配置文件。<bean>
标签用于定义一个 Spring bean。这里定义了一个RequestMappingHandlerMapping
bean,它用于处理基于注解的控制器请求映射。<property name="interceptors">
标签用于设置RequestMappingHandlerMapping
bean 的interceptors
属性,这个属性是一个拦截器列表。<bean class="example.MyInterceptor"/>
定义了一个名为example.MyInterceptor
的拦截器 bean,它会被添加到RequestMappingHandlerMapping
的拦截器列表中。
通过这样的配置,example.MyInterceptor
将作为拦截器用于处理所有匹配的请求。
Intercepting requests with a HandlerInterceptor
使用 HandlerInterceptor 拦截请求
Spring 的处理器映射机制包括处理器拦截器,这在你希望对某些请求应用特定功能时非常有用,例如检查主体。
位于处理器映射中的拦截器必须实现 org.springframework.web.servlet
包中的 HandlerInterceptor
接口。此接口定义了三个方法:preHandle(..)
在实际处理器执行之前调用;postHandle(..)
在处理器执行后调用;afterCompletion(..)
在整个请求完成后调用。这三个方法应该提供足够的灵活性来进行各种预处理和后处理。
preHandle(..)
方法返回一个布尔值。你可以使用此方法来中断或继续执行链的处理。当此方法返回 true
时,处理器执行链将继续;当它返回 false
时,DispatcherServlet
假定拦截器本身已经处理了请求(例如,渲染了适当的视图),并且不会继续执行执行链中的其他拦截器和实际处理器。
可以使用 interceptors
属性配置拦截器,该属性存在于从 AbstractHandlerMapping
扩展的所有 HandlerMapping
类上。以下示例展示了如何配置:
<beans><bean id="handlerMapping"class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"><property name="interceptors"><list><ref bean="officeHoursInterceptor"/></list></property></bean><bean id="officeHoursInterceptor"class="samples.TimeBasedAccessInterceptor"><property name="openingTime" value="9"/><property name="closingTime" value="18"/></bean>
</beans>
package samples;public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {private int openingTime;private int closingTime;public void setOpeningTime(int openingTime) {this.openingTime = openingTime;}public void setClosingTime(int closingTime) {this.closingTime = closingTime;}public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {Calendar cal = Calendar.getInstance();int hour = cal.get(HOUR_OF_DAY);if (openingTime <= hour && hour < closingTime) {return true;}response.sendRedirect("http://host.com/outsideOfficeHours.html");return false;}
}
在上述代码中,我们定义了一个 TimeBasedAccessInterceptor
拦截器,它会在处理任何请求之前检查当前时间是否在办公时间内。如果在办公时间内,请求将继续处理;否则,用户将被重定向到一个静态的 HTML 文件。
在这个配置中,任何由 RequestMappingHandlerMapping
处理的请求都会被 TimeBasedAccessInterceptor
拦截。如果当前时间在 openingTime
和 closingTime
之间,拦截器返回 true
,请求继续处理。否则,拦截器会重定向到一个静态的 HTML 文件,并返回 false
来中断请求处理。
注意事项
- 使用
RequestMappingHandlerMapping
时,实际处理器是一个HandlerMethod
实例,它标识将被调用的具体控制器方法。 HandlerInterceptorAdapter
类简化了扩展HandlerInterceptor
接口的工作。- 如果你想将拦截器应用于特定的 URL 路径,可以使用 MVC 命名空间或 MVC Java 配置,或者声明类型为
MappedInterceptor
的 bean 实例。
实现方法的局限性
HandlerInterceptor
的postHandle
方法并不总是适用于@ResponseBody
和ResponseEntity
方法。在这种情况下,HttpMessageConverter
会在postHandle
调用之前写入并提交响应,这使得修改响应(例如添加一个头部信息)变得不可能。- 可以实现
ResponseBodyAdvice
接口,并将其声明为@ControllerAdvice
bean,或直接在RequestMappingHandlerAdapter
上配置,以解决上述问题。
相关文章:
4.Handler mappings
处理程序映射 简介 在早期版本的 Spring 中,用户需要在 Web 应用程序上下文中定义一个或多个 HandlerMapping bean 以将传入的 Web 请求映射到适当的处理程序。随着注解控制器的引入,通常不再需要这样做,因为 RequestMappingHandlerMapping…...
《学会 SpringMVC 系列 · 消息转换器 MessageConverters》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
深度学习项目 -7-使用 Python 的手写数字识别
一、前言 该文章仅作为个人学习使用 二、正文 项目源代码:深度学习项目 - 使用 Python 进行手写数字识别 - DataFlair (data-flair.training) 数据集:https://drive.google.com/open?id1hJiOlxctFH3uL2yTqXU_1f6c0zLr8V_K Python 深…...
MySQL —— 库,数据类型 与 表
库与基础操作 1.1 查看数据库 使用 show databases; 可以查看当前 MySQL 目前有多少个数据库 5 rows 表示有 5 行,这里是表示的是有效的数据,不包括 第一行的指引 set 表示结果集合 0.01 sec 表示这个 sql 语句一共运行了0.01 秒,一般情况…...
Java重修笔记 第二十七天 匿名内部类
匿名内部类 1. 定义:无类名(底层自动分配类名“外部类名$1”),既是类也是对象,定义在外部类的局部位置,例如方法体和代码块中,通过new类或接口并在大括号里重写方法来实现。 2. 使用场景&…...
Nero Lens 智图 - 适用于 iOS 和 iPadOS 的专业图片处理 App
首先是手机端的无损放大 App:Nero Lens 智图,适用于 iOS 和 iPadOS,不仅可以放大,还有多种 AI 图片增强功能。 使用这款 App 可以通过 AI 模型智能放大可达 400%,还有老照片去划痕、上色,抠图移除背景、照…...
Nginx代理路径被吃
Nginx代理路径被吃的情况 日常工作中经常使用nginx反向代理一些资源,有时正常代理,发现代理不过去。 验证被吃调location情况 通过浏览器访问: https://zhao138969.com/LinuxPackage/Python/SelectDocker location /LinuxPackage { proxy…...
pytest-html报告修改与汉化
前言 Pytest框架可以使用两种测试报告,其中一种就是使用pytest-html插件生成的测试报告,但是报告中有一些信息没有什么用途或者显示的不太好看,还有一些我们想要在报告中展示的信息却没有,最近又有人问我pytest-html生成的报告&a…...
react-native从入门到实战系列教程一Swiper组件的使用及bug修复
轮播图,在app中随处可见,这么重要的功能我们怎么可能不学习下在react-native中的实现方式。 依然是第三方组件react-native-swiper 官网地址 https://www.npmjs.com/package/react-native-swiper 组件使用的组件及事件参考官方即可。 实现效果 官网…...
springboot开发的常用注解总结-配置组件类注解
Spring Boot 提供了许多注解,这些注解大大简化了 Spring 应用的配置和开发过程。以下是一些常见的 Spring Boot注解及其作用。 目录 配置组件类 (Configure Component )Configuration解释:Demo Code:更深度使用&#x…...
DataX 最新版本安装部署
1、下载 git clone gitgithub.com:alibaba/DataX.git 2、打包 mvn -U clean package assembly:assembly -Dmaven.test.skiptrue...
【架构】应用保护
这篇文章总结一下应用保护的手段。如今说到应用保护,更多的会想到阿里的sentinel,手段丰富,应用简单。sentinel的限流、降级、熔断,可以自己去试一下,sentinel主要通过配置实现功能,不难。sentinel的简介放…...
从核心到边界:六边形、洋葱与COLA架构的深度解析
文章目录 1 引言2 软件架构3 架构分类4 典型的应用架构4.1 分层架构4.2 CQRS4.3 六边形架构4.4 洋葱架构4.5 DDD 5 COLA架构设计5.1 分层设计5.2 扩展设计5.3 规范设计5.3.1 组件规范5.3.2 包规范5.3.3 命名规范 6 COLA架构总览7 小结 1 引言 软件的首要技术使命:管…...
04-Fastjson反序列化漏洞
免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…...
ABC365(A-D)未补
A - Leap Year(模拟) 题意:给定一个数字n,如果n不是4的倍数,输出365;如果n是4的倍数但不是100的倍数,输出366;如果n是100的倍数但不是400的倍数,输出365;如果…...
Python用png生成不同尺寸的图标
Kimi生成 from PIL import Imagedef generate_icon(source_image_path, output_image_path, size):with Image.open(source_image_path) as img:# 转换图片为RGBA模式,确保有透明通道if img.mode ! RGBA:img img.convert(RGBA)# 调整图片大小到指定尺寸img img.r…...
1688中国站获得工厂档案信息 API
公共参数 名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...
定时任务框架 xxl-job
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
C/C++关键字大全
目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…...
ROS2 Linux Mint 22 安装教程
前言: 本教程在Linux系统上使用。 一、linux安装 移动硬盘安装linux:[LinuxToGo教程]把ubuntu装进移动固态,随时随用以下是我建议安装linux mint版本的清单: 图吧工具箱:https://www.tbtool.cn/linux mint: https://…...
快速将网站从HTTP升级为HTTPS
在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…...
Qt程序移植至Arm开发板
目录 1.工具准备: 系统调试工具SecureCRT 虚拟机安装linux(Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2)交叉编译工具链配置 2.编译Qt工程: 2.0 交叉编译 依赖库源码,生成动…...
删除分区 全局索引 drop partition global index Statistics变化
1.不一定unusable,可以先删除data (index 再删除过程中会更新结构)再drop/truncate. ---------------------- CREATE TABLE interval_sale ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE ) PARTITION BY RANGE (time_i…...
git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支
文章目录 1、git回退未commit2、git回退已commit3、git回退已push的代码3.1 直接丢弃某一次的push3.2 撤销push后,不丢弃改动,重新修改后要再次push 4、合并某一次commit到另一个分支 整理几个工作上遇到的git问题。 1、git回退未commit git回退未comm…...
yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中
特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…...
程序员找工作之操作系统面试题总结分析
程序员在找工作面试时,操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析: 1. 核心硬件与体系结构 微机的核心部件:询问微机硬件系统中最核心的部件是什么(CPU)。处理机…...
TypeScript 迭代器和生成器详解
目录 迭代器(Iterators) 生成器(Generators) 使用场景 for..of vs. for..in 语句 for..of 循环 for..in 循环 区别总结 注意事项 总结 在 TypeScript 中,迭代器(Iterators)和生成器&am…...
echarts 极坐标柱状图 如何定义柱子颜色
目录 echarts 极坐标柱状图 如何定义柱子颜色问题描述方式一 在 series 数组中定义颜色方式二 通过 colorBy 和 color 属性配合使用 echarts 极坐标柱状图 如何定义柱子颜色 本文将分享在使用 echarts 的 极坐标柱状图 时,如何自定义柱子的颜色。问题本身并不难解决…...
JavaScript模块化
JavaScript模块化 一、CommonJS规范1、在node环境下的模块化导入、导出 2、浏览器环境下使用模块化browserify编译js 二、ES6模块化规范1、在浏览器端的定义和使用2、在node环境下简单使用方式一:方式二: 3、导出数据4、导入数据5、数据引用问题 一、Com…...
文件包含漏洞Tomato靶机渗透_详解
一、导入靶机 将下载好的靶机拖入到VMware中,填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段,发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…...
应用java网站建设前景/国外服务器免费ip地址
我的安装文件是ISO镜像文件,使用Virtual DAEMON Manager v 4.10打开: ora9i-1.iso ora9i-2.iso ora9i-3.iso 首先必须把上面三个镜像文件都mount到 drivers 里面。 启动Oracle 9i安装文件,从ora9i-1.iso开始,如图所示:…...
网页显示站点不安全/优化推广方案
或许大家会感到好奇,为什么现在越来越多的高校学子会主动去外面参加培训班呢,而且人数也越来越多呢?其实一般来说有供给就有需求。现在教育机构的出现绝非偶然,他们的产生和发展都是符合社会发展潮流的。 现在的大学大部分教授的…...
建设银行网站怎么查流水/网站制作费用多少
自定义文本编辑器概述您可以在管理资产和创建通信UI中自定义文本编辑器,以添加更多字体和字体大小。 这些字体包括英语和非英语,如日语、字体。您可以进行自定义,以在字体设置中更改以下内容:字体系列和大小高度和字母间距等属性字…...
顺义区快速建站/东莞网站建设排名
前言 前段时间从蚂蚁金服二面回来,有些许面试新的给大家分享。 毕业至今两年一直在A金融公司做Java开发,在一个公司时间长了我也想换个环境,于是在网上投了简历,选择公司我的目标很明确还是金融领域,最好能进大一点的…...
wordpress模板怎么修改/app推广工作靠谱吗
数据库变更管理 1 目的 1 角色与职责 1 启动准则 1 输入 1 主要步骤 1 [Step1] 数据库设计变更申请 1 [Step2] 审批数据库设计变更申请 1 [Step3] 更改数据库设计文档 2 [Step4] 重新进行数据库设计确认 2 输出 2 结束准则 2 度量 2 数据库变更管理 目的 铁路客票安全系统的…...
免费开源的建站系统/设计网站排行榜前十名
Kotlin 文章目录Kotlin1 封装2 继承3 抽象类4 接口4.1 接口中的属性4.2 函数重写1 封装 封装的定义是隐藏内部实现的细节。 class WashCloth(name:String,num:Int) {fun open(){println("开")}fun close(){println("关")} }fun main(args: Array<Stri…...