我的编程空间,编程开发者的网络收藏夹
学习永远不晚

滥用@PathVariable导致出现bug如何解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

滥用@PathVariable导致出现bug如何解决

这篇“滥用@PathVariable导致出现bug如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“滥用@PathVariable导致出现bug如何解决”文章吧。

    前言

    先说结论吧:@PathVariable可以使请求参数动态的绑定到URL上,但是如果请求参数中包含特殊字符,比如 /,就可能导致Spring匹配到一个错误的URL,或者匹配不到合适的URL。

    复现

    下面,我用一个简单的伪代码复现一下这个bug,与大家分析一下这个bug发生的原因,以及如何解决,最后顺便再通过源码加深一下印象。

    如下,我们定义一个接口,并且通过@PathVariable将入参动态的绑定到URL上。

    @RestController@RequestMapping(value = "/demo")public class DemoController {    @GetMapping(value = "/getVal/{val}")    public ResponseEntity<Object> getVal(@PathVariable String val){        System.out.println("参数:" + val);        return ResponseEntity.ok(val);    }}

    然后我们测试一下这个接口:

    滥用@PathVariable导致出现bug如何解决

    正常情况下,我们输入一个普通无特殊符号的参数,控制台也成功打印了出来。

    但是业务参数往往是不可控的,比如当参数变成“ hello/world”时,代码就不能正常执行了。

    滥用@PathVariable导致出现bug如何解决

    大家可以从图中看到,Spring将原本预期的URL:/demo/getVal/{val},解析成了/demo/getVal/hello/world。

    而之所以测试同学最近才发现这个接口有问题,也正是因为上线之初并没有遇到带有/的参数,所以接口看起来是正常的,直到最近在生产环境遇到了一个带/的参数。

    正确的做法是:将URL定义为/demo/getVal,然后将参数通过表单或者query的方式传递。

    滥用@PathVariable导致出现bug如何解决

    解决的办法很简单,相信有点经验的同学都能很快将这个问题修复。

    但是知其然,更要知其所以然,顺着这个问题,我们探究一下Spring究竟是如何解析URL的。

    首先,我们找到Spring webmvc的包,在org.springframework.web.servlet.handler包下找到AbstractHandlerMethodMapping类,这个类就是会将我们定义的mapping和URL绑定起来。

    这个类中的lookupHandlerMethod方法,会查找当前请求的最佳匹配处理程序方法,并且如果找到多个匹配项,就选择最佳匹配项。

    滥用@PathVariable导致出现bug如何解决

    分析这个方法,我们可以得到这样3个匹配步骤

    3个匹配步骤

    1,根据Path精准匹配

    滥用@PathVariable导致出现bug如何解决

    2,如果精准匹配没有成功,就开始模糊匹配

    滥用@PathVariable导致出现bug如何解决

    3,如果模糊匹配还匹配不上,就返回null

    滥用@PathVariable导致出现bug如何解决

    滥用@PathVariable导致出现bug如何解决

    以上就是关于“滥用@PathVariable导致出现bug如何解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    滥用@PathVariable导致出现bug如何解决

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    滥用@PathVariable导致出现bug如何解决

    这篇“滥用@PathVariable导致出现bug如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“滥用@PathVar
    2023-07-04

    不规范使用ThreadLocal导致bug如何解决

    这篇文章主要讲解了“不规范使用ThreadLocal导致bug如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不规范使用ThreadLocal导致bug如何解决”吧!因为线程重用导致的
    2023-07-04

    win7电脑待机导致系统出现断网现象如何解决

    本文小编为大家详细介绍“win7电脑待机导致系统出现断网现象如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7电脑待机导致系统出现断网现象如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。解决方
    2023-06-27

    mysql内存表导致内存溢出如何解决

    内存表导致内存溢出的问题可以通过以下几种方式解决:增加服务器内存:如果内存表导致内存溢出,可以尝试增加服务器的内存,以提供更多的内存空间给内存表使用。优化查询语句:优化查询语句可以减少内存表的内存占用,可以尝试使用更加高效的查询语句来减少内
    mysql内存表导致内存溢出如何解决
    2024-04-09

    win11打开pdf文件出现bug如何解决

    这篇文章主要讲解了“win11打开pdf文件出现bug如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win11打开pdf文件出现bug如何解决”吧!win11打开pdf文件出现bug
    2023-07-01

    win11导致office不可用如何解决

    本篇内容介绍了“win11导致office不可用如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法一: 1、如果我们使用的是正版of
    2023-07-01

    eclipse导入包出现乱码如何解决

    要解决eclipse导入包出现乱码的问题,可以尝试以下几个步骤:确定乱码的具体表现形式,是在包名中、类名中、还是在注释、字符串中等。这有助于定位问题所在。检查源代码文件的编码格式。在Eclipse中,可以通过右键点击文件 -> Proper
    2023-10-26

    如何解决催化剂8.11驱动bug导致Vista x64双卡交火蓝屏的问题

    本篇文章为大家展示了如何解决催化剂8.11驱动bug导致Vista x64双卡交火蓝屏的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。AMD Catalyst 8.11驱动在不久前更新,号称修正
    2023-06-14

    如何解决Vue.js导出Excel出现乱码的问题

    Vue.js是一款流行的前端 JavaScript 框架。在Vue.js开发中,使用二进制文件来导出Excel文件时,可能会遇到Excel乱码的问题。这篇文章将通过介绍二进制编码的概念和解决方案来帮助大家解决Vue.js导出Excel出现乱码的问题。一、二进制编码二进制编码是计算机中十分重要的概念,这里进行一个简单的介绍。计算机中的数据都是以二进制数存储的,二进制数仅由0和1组
    2023-05-14

    java导入程序出现import错误如何解决

    如果在Java程序中导入语句出现错误,可以尝试以下解决方法:1. 检查导入语句是否正确:确保导入语句的语法正确,包括正确的包名和类名。检查是否有拼写错误或者遗漏了必要的符号。2. 检查类路径:如果导入的类位于外部库或模块中,确保这些库或模块
    2023-09-15

    c++循环引用导致的内存泄露如何解决

    在 C++ 中,循环引用(circular reference)是指两个或多个对象相互引用,导致内存泄漏的情况。解决循环引用导致的内存泄漏问题可以采取以下几种方法:1. 使用智能指针(smart pointers):智能指针是 C++ 提供
    2023-10-10

    如何解决调用Process.waitfor导致的进程挂起问题

    这篇文章主要介绍如何解决调用Process.waitfor导致的进程挂起问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题背景如果要在Java中调用shell脚本时,可以使用Runtime.exec或Proces
    2023-06-22

    出现explorer.exe应用程序错误导致Win7系统黑屏的解决办法

    大家都知道explpythonorer.exe是Windows资源管理器程序,该程序一旦遭到损坏或程序错误很有可能会出现各种故障问题,最近有用户在为电脑设置账户和密码后,电脑开机登录输入正确信息就直接黑屏,出现这种现象很有可能就是explo
    2023-06-12

    如何解决ie6下关于html编码问题导致js出错css不被应用

    本篇内容主要讲解“如何解决ie6下关于html编码问题导致js出错css不被应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决ie6下关于html编码问题导致js出错css不被应用”吧!
    2023-06-08

    如何解决MySQL存储时间出现不一致的问题

    小编给大家分享一下如何解决MySQL存储时间出现不一致的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!用Java在获取了系统时间后,存入MySQL数据库时,当时间的类型为datetime或Timestamp时发现数据库
    2023-06-14

    java内存异常使用导致full gc频繁如何解决

    这篇文章主要介绍了java内存异常使用导致full gc频繁如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java内存异常使用导致full gc频繁如何解决文章都会有所收获,下面我们一起来看看吧。问题系
    2023-07-06

    Windows11 企业版默认启用 SMB 身份验证导致出错,微软现给出解决方法

    6 月 14 日消息,一年多以前,微软宣布不再向 Windows 11 家庭版提供 Server Message Block(SMB1),因为这是一种非常老的网络安全协议,目前已经不再安全,但 SMB 仍存在于 Windows 11 中。
    2023-07-16

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录