彻底解决Springboot中路径参数带 (%2F)的问题

news2025/1/16 18:03:46

彻底解决Springboot中路径参数带/(%2F)的问题

背景

前两天突然出现了一个线上问题,有同事反应我提供的接口报400的错误。接口路径如下 PATCH /v1/basic/owners/{owner_code}/skus/{sku},经过排查发现是sku参数中有/因此springboot转义后直接报错了。由于已经有很多团队对接了相关接口,且有很多的其他接口都使用了类似的传参方式,因此需要考虑怎么在系统中不让springboot自动解码

解决方案

我先列出可用的解决方案,然后在列出网上常见错误方案

  1. 在项目中添加环境变量
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");

在这里插入图片描述

  1. 关闭spring自动decode url的开关
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}
  1. 开启Spring security中允许url中存在/的功能(如果项目中没有用到Spring security 可跳过此配置)
@Order(Ordered.LOWEST_PRECEDENCE)
@Configuration
public class SecurityFirewallConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
        DefaultHttpFirewall firewall = new DefaultHttpFirewall();
        firewall.setAllowUrlEncodedSlash(true);
        return firewall;
    }
}

注意大部分项目中都有Spring security相关的设置,所以这里注意一下优先级

在项目中配置好这三项后,url中的参数已经可以正常解析了(注意需要让接口使用法把带/的参数encode之后再调用我们的接口)

在这里插入图片描述
在这里插入图片描述

常见的错误答案

  1. 使用正则匹配获取参数
@PostMapping("/v1/basic/owner-code/{ownerCode}/skus/{sku:.+}/ext-info")
public ResponseEntity<String> getInfo(@PathVariable("ownerCode") String ownerCode, @PathVariable("sku") String sku) {
    // your logic here
}

这里的.+只是一个示例,还有很多种正则的写法。这是很多人的博客中被提及的方案,但并不能解决问题

  1. 覆盖Spring MVC默认URL解码行为的配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper() {
            @Override
            public Map<String, String> decodePathVariables(HttpServletRequest request, Map<String, String> vars) {
                return vars;
            }
        };
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

看起来很有效,实际上也不行

  1. 使用@MatrixVariable接受参数
@PostMapping("/v1/basic/owner-code/{ownerCode}/skus/{sku:.+}/ext-info")
public ResponseEntity<String> getInfo(@PathVariable("ownerCode") String ownerCode, @MatrixVariable("sku") String sku) {
    // your logic here
}
  1. 自定义filter并添加到spring中
public class UrlEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        String url = request.getRequestURL().toString();
        // 如果你的SKU部分总是在URL的特定位置,可以使用这种方式来找到它并进行二次编码
        String encodedUrl = url.replace("skus/", "skus/").replace("/ext-info", "%2Fext-info");

        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {
            @Override
            public StringBuffer getRequestURL() {
                return new StringBuffer(encodedUrl);
            }
        };
        chain.doFilter(requestWrapper, res);
    }
}

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

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

相关文章

chatgpt赋能python:Python画的图是放置在什么位置合适?

Python画的图是放置在什么位置合适&#xff1f; Python作为一门流行的编程语言&#xff0c;已经被广泛应用于数据科学和机器学习的领域。在这些领域&#xff0c;数据可视化是一个重要的环节。Python提供了许多强大的可视化工具&#xff0c;可以帮助我们更好地了解和分析数据。…

chatgpt赋能python:Python画图设置背景颜色

Python画图设置背景颜色 在Python中使用Matplotlib和Seaborn等库来生成数据可视化图表非常方便。但是&#xff0c;这些图表默认使用白色背景。有时&#xff0c;我们需要在制作图表时更改背景颜色以匹配我们的主题或品牌标识。本文将介绍如何在Matplotlib和Seaborn中设置不同的…

flutter开发 - 七牛云上传sdk插件qiniu_flutter_sdk使用

flutter七牛云上传sdk插件qiniu_flutter_sdk使用 最近在拆分代码&#xff0c;将上传组件设置成插件&#xff0c;下面记录下实现过程。 一、创建flutter_plugin上传插件 这里Android Studio使用创建plugin 填写一下信息 Project nameProject locationDescriptionProject typ…

chatgpt赋能python:Python画照片上的人——让照片更生动

Python画照片上的人——让照片更生动 随着社交媒体的普及&#xff0c;我们经常会在朋友圈或者Instagram上看到各种美丽的照片&#xff0c;不管是旅游照还是日常生活中的自拍&#xff0c;照片已经成为了人们生活中不可或缺的一部分。 为了让照片更加生动&#xff0c;有时候我们…

chatgpt赋能python:用Python绘制黑色图像的SEO优化

用Python绘制黑色图像的SEO优化 Python是一种功能强大的编程语言&#xff0c;由于其易于学习和使用的特性&#xff0c;已经成为数据科学和机器学习的首选工具。同时&#xff0c;Python还拥有强大的可视化能力&#xff0c;可以帮助数据科学家和机器学习工程师更好地理解和呈现他…

chatgpt赋能python:Python的Popen介绍及使用方法

Python的Popen介绍及使用方法 在Python编程中&#xff0c;我们经常需要执行外部命令并获取结果。而Python中的Popen函数就是一个方便的工具&#xff0c;可以启动另一个进程并与之交互。在本文中&#xff0c;我们将介绍Popen的基础知识以及使用方法。 Popen的基本用法 Popen是…

关于 html2canvas 将HTML导出图片

最近我看到了一篇关于如何解决 HTML2Canvas 导出图片模糊的问题的博客。在过去的项目中&#xff0c;我也使用过 HTML2Canvas 插件将活动页面导出为图片&#xff0c;并且好像也遇到了类似的问题&#xff0c;尽管记忆已经有些模糊了。今天我想仔细研究一下这个问题的原因。 在网…

计系(2)复习

期末了&#xff0c;就是看书有点看不进去。所以我想着打字打出来吧&#xff0c;应该能看进去一些。 目录 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第六章 存储器层次结构 第七章 链接 第一章 计算机系统漫游 1.2 程序被其他程序翻译成不…

信道特性(通信原理)

信道模型&#xff1a;信道模型的相关知识用信息理论与编码的知识来进行学习。 信道的分类&#xff1a;根据通信信道一般性来划分。 信道的噪声也是值得探究的一个学习点&#xff0c;感兴趣的可以进行查找。 根据信道输入/输出信号在时间和幅值上的离散或连续来划分如下&#…

【刷题笔记】牛客网:链表指定区间内反转

【刷题笔记】牛客网&#xff1a;链表指定区间内反转 一、题目描述及示例 二、思路分析 1、首先&#xff0c;我们来定义一个虚拟的头节点tempHead&#xff08;原因&#xff1a;如果从第一个位置开始反转&#xff0c;则可以不用进行特殊情况考虑&#xff09;&#xff0c;并使te…

chatgpt赋能python:PythonGCD:介绍与计算方法

Python GCD&#xff1a;介绍与计算方法 Python是一种流行的编程语言&#xff0c;它在计算数学问题时也非常实用。其中一个基本的数学问题就是计算两个或多个数的最大公约数&#xff08;GCD&#xff09;。Python的math库提供了计算GCD的方法&#xff0c;但我们也可以编写我们自…

13.STM32F103C8使用PSRAM64H外扩RAM空间

一、简介 最近在调试STM32F103C8驱动墨水屏的实验&#xff0c;在使用过程中&#xff0c;需要使用大内存的RAM需要&#xff0c;由于C8T6的RAM空间只有20KB&#xff0c;而墨水屏的需要的内存为800*480*2/893.75KB。 在网上查了相关的方案&#xff0c;都是使用STM32F103ZE外扩IS6…

基于模拟退火算法的旅行商问题优化(matlab程序)

0.代码链接 基于模拟退火算法的旅行商问题优化&#xff08;matlab程序&#xff09;资源-CSDN文库 1.简述 金属退火是将金属加热到一定温度&#xff0c;保持足够时间&#xff0c;然后以适宜速度冷却(通常是缓慢冷却&#xff0c;有时是控制冷却)的一种金属热处理工艺。模拟退…

ubuntu22.04安装atlas2.0.0

这是本人《数据治理》课程的课程实验&#xff0c;对本人来说非常具有挑战性。 环境: 1、Apache Atlas 2.0 2、JDK 1.8.0_251 3、Maven 3.6.3 因为是课程作业&#xff0c;不用于生产。使用Atlas内嵌Hbase与Solr的部署方式。 在ubuntu裸机上安装&#xff0c;裸机未安装java&#…

ChatGPT | Word表格整体输出

本文来自欧巴Godwin的博客 &#xff0c;引用必须注明出处&#xff01; 用LangChain读取Word和PDF的文字内容是好的&#xff0c;但如果内容包含表格则读取出来的内容完全没法看。用ChatGPT往往是做企业知识库&#xff0c;所以会出现一个场景&#xff0c;即员工想让ChatGPT讲解包…

2、数据库操作语句:多表查询(表employ、department、location)

目录 1、多表查询连接条件 1&#xff09;在employ、department两张表中查询 2&#xff09;若查询语句中出现了多个表中都存在的字段&#xff0c;必须指明此字段所在的表。 3&#xff09;如果表名比较长&#xff0c;SQL语句中多次使用表名&#xff0c;可以给表起别名&#xf…

chatgpt赋能python:Python实现Fibonacci数列

Python实现Fibonacci数列 Fibonacci数列是一个非常经典的数列&#xff0c;定义如下&#xff1a; F ( 0 ) 0 , F ( 1 ) 1 F(0)0, F(1)1 F(0)0,F(1)1 F ( n ) F ( n − 1 ) F ( n − 2 ) F(n)F(n-1)F(n-2) F(n)F(n−1)F(n−2) 也就是说&#xff0c;第n个数等于前两个数之和…

开环模块化多电平换流器仿真(MMC)N=6

模型简介&#xff1a; 运行环境MATLAB2021a 开环模块化多电平换流器仿真&#xff08;MMC&#xff09;N&#xff1d;6&#xff0c;连接负载&#xff0c;采用载波移相调制。 可以得到换流器输出N&#xff0b;1&#xff1d;7电平的相电压波形。可考虑线路阻抗。 子模块采用半桥结…

chatgpt赋能python:用Python实现网络工具——Ping

用Python实现网络工具——Ping 网络是现代社会不可或缺的一部分&#xff0c;而网络工具也是每个程序员的必备技能之一。其中&#xff0c;Ping是最常用的网络工具之一&#xff0c;主要用于测试两台计算机之间的网络连接质量。今天&#xff0c;我们将着重讨论如何用Python实现Pi…

【初识C语言(5)】C语言关键字+define定义常量和宏

文章目录 1. 常见关键字2. 关键字 typedef3. 关键字 static3.1 修饰局部变量3.2 修饰全局变量3.3 修饰函数 4. define 定义常量和宏 1. 常见关键字 C语言提供了丰富的关键字&#xff0c;这些关键字都是语言本身预先设定好的&#xff0c;用户自己是不能创造关键字的。 这里先主要…