Springboot请求的URL中含有‘:‘、‘/‘等转义字符导致404错误问题_springboot 参数里面带/导致请求异常-程序员宅基地

技术标签: JAVA  java  

本来在上一次解决“Springboot用@PathVariable传参,最后一个参数小数点(.)后面数据丢失问题”时,花费了一些时间,解决了问题。但是没想到此次项目中的请求URL含有的不仅仅是一个小数点这么简单的,更多的是各种特殊字符的混搭。

例如下面的一个请求:(delete方式)

http://localhost:8088/backend/api/v2/users/[email protected]/element
/http%3A%2F%2Ftext-add%3A8090%2Foperation%2Ftext.add

请求有点长,编码前的请求是:

http://localhost:8088/backend/api/v2/users/[email protected]/element
/http://text-add:8090/operation/text.add

经过前端的处理变成上面编码后的请求:(前端如下)

del(elementUri) {
        return this.$http({
            method: 'DELETE',
            url: this.urlBase() + "/element/" + encodeURIComponent(elementUri)
        })
    }

将浏览器中的请求导入到postman中,进行调试,请求结果报错404

{
    "timestamp": "2020-10-14T11:07:45.914+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/backend/api/v2/users/[email protected]/element/http%3A%2F%2Ftext-add%3A8090%2Foperation%2Ftext.add"
}

查了一下网上,有很多关于问题一:“Springboot2.x以上的版本访问URL带有[]{}|等特殊字符,报错400”和问题二:“报错 characters are defined in RFC 7230 and RFC 3986”的问题,因为问题相似,就尝试了以上说明的一些解决方法。

问题一方法:(Springboot2.x以上版本)

在启动类中加系统参数,重写WebMvcConfigurer的configurePathMatch方法(重写的方法可不放在启动类中,放在实现WebMvcConfigurer的WebMvcConfig配置类中也行)

@SpringBootApplication
public class Application implements WebMvcConfigurer {

    public static void main(String[] args) throws Exception {
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

加入后试了一下请求,还是报错404;

问题二方法:(Springboot2.x以上版本)

原因:tomcat新版本增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

方法:修改Tomcat  Connector属性:relaxedQueryChars,引入这个配置

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> 
        connector.setProperty("relaxedQueryChars", "|{}[]\\"));
        connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
        return factory;
    }

加入后试了一下请求,还是报错404;

(在加了以上两种方法的基础上)后来尝试了下,将请求的url中,只留下一两处转义字符,其余的删除试试,例如

发现请求可以通过,于是将两处方法分别删除试了下,终于发现能够通过特殊字符的方法是问题一的方法,问题二排除。

请求里只要加上“%3A%2F%2F”这种复杂组合的转义字符,就还是会报错404,问题还是没解决.....

既然问题一的方法是配置了UrlPathHelper,在查找 类UrlPathHelper 的相关文档时

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/UrlPathHelper.html

发现了这个说明:

于是加入这个配置试试:

发送请求,请求通过!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MTonj/article/details/109102790

智能推荐

Python大作业——爬虫+可视化+数据分析+数据库(数据库篇)-程序员宅基地

文章浏览阅读742次,点赞22次,收藏9次。msg_box = QMessageBox(QMessageBox.Warning, ‘温馨提示’, ‘用户名和密码不能为空’)msg_box = QMessageBox(QMessageBox.Warning, ‘错误提示’, ‘用户名或者密码错误’)msg_box = QMessageBox(QMessageBox.Warning, ‘温馨提示’, ‘用户名已经存在’)msg_box = QMessageBox(QMessageBox.Warning, ‘温馨提示’, ‘数据库连接错误’)

FreeType在嵌入式系统中显示矢量字体_矢量字体 csdn-程序员宅基地

文章浏览阅读83次。在这个示例中,我们使用FT_Load_Glyph()函数加载字符索引为charIndex的字符。在这个例子中,我们使用FT_Set_Pixel_Sizes()函数设置字体的像素大小。在这个例子中,我们包含了FreeType的头文件,并定义了一个FT_Library对象来表示FreeType库的实例。在这个示例中,我们使用FT_New_Face()函数加载名为"font.ttf"的字体文件。一旦字体的大小和字符编码设置完成,我们可以进行字体的渲染和显示。在显示字体之前,我们需要设置字体的大小和字符编码。_矢量字体 csdn

Mysql的列式数据库infobright存储引擎_列式存储数据库选型-程序员宅基地

文章浏览阅读7.9k次。什么是infobright? Infobright是一个与MySQL集成的开源数据仓库软件,可作为MySQL的一个存储引擎来使用,SELECT查询与普通MySQL无区别。优点:Ø查询性能高 --比普通Mysql 数据库引擎(MyISAM、InnoDB) 快5-60倍.Ø存储数据量大 --能存储的数据量特别大.Ø高压缩比 --_列式存储数据库选型

学生党双十一蓝牙耳机选购指南,高颜值平价实用蓝牙耳机推荐_击音f1-程序员宅基地

文章浏览阅读179次。蓝牙耳机发展到现在算是达到了高峰,其中涌现的品牌产品不计其数。这就让很多消费者对蓝牙耳机的购买关注点发生了变化,从只认品牌到追求性价比了,而且现在许多平价蓝牙耳机的确是非常值得入手的。刚好双十一也快来临了,又到了购物狂欢节,所以小编就整理了一些性价比高且性能优异的蓝牙耳机,分享给各位。击音F1击音F1搭载了全新的蓝牙5.0芯片,在更高效稳定连接的同时,还将声音信号同时传达到左右耳单元,做到了更低延迟,可以听声辨位占据主动,配合着出众的AAC/SBC高清解码,优化还原了CD级音质,不管是听音乐还是_击音f1

如何定制丝网印刷电极-程序员宅基地

文章浏览阅读30次。丝网印刷电极(Screen-printed electrodes,SPE)是利用印刷技术将碳胶、银胶等各类不同胶材,以不同的设计图样印刷于不易溶解于水的基板/底板上而得到的电极。我们要再聊一下当市售电极无法满足实验需求是该如何定制化丝网印刷电极的。

【张兔兔送书第一期:考研必备书单】-程序员宅基地

文章浏览阅读4k次,点赞55次,收藏55次。八九月的朋友圈刮起了一股晒通知书潮,频频有大佬晒出“研究生入学通知书”,看着让人既羡慕又焦虑。果然应了那句老话——比你优秀的人,还比你努力。

随便推点

解决ubuntu20.04虚拟机无法上网的问题_ubuntu20.04中的网卡不显示inet-程序员宅基地

文章浏览阅读3.1w次,点赞84次,收藏237次。@linux虚拟机无法正常上网前言刚建立好的linux虚拟机使用NAT方式可以连接外网,系统重启几次,系统无法上网,这是什么问题导致的呢?提示:以下是本篇文章正文内容,下面案例可供参考一、现象使用ifconfig命令查看系统ip相关参数,发现只有网卡lo,外网网卡找不到了。使用ifconfig -a 命令查看网卡相关信息,会看到ens33网卡的相关信息:使用命令sudo ifconfig ens33 up,在使用ifconfig查看网络配置,我们会发现,出现了ens33网络配置:这_ubuntu20.04中的网卡不显示inet

Thinkpad笔记本键盘拆卸_thinkpad键帽拆卸图解-程序员宅基地

文章浏览阅读7.5w次,点赞2次,收藏9次。1、键盘的拆卸并不需要从背板开始,可以直接拆键盘。可以参考视频http://v.youku.com/v_show/id_XMzg4MTc4NjUyNA==.html?spm=a2h0j.11185381.listitem_page1.5!2~A2、键盘帽的拆卸。先扣左上角,再扣右上角,再慢慢拉掉下面的部分,就可以卸掉键帽。安装键帽,只需要按下去,听到两声咔咔就行了。3、键盘x支..._thinkpad键帽拆卸图解

【Godot4.2】注释习惯 -- 拒绝屎山,提高代码可读性_godot 注释-程序员宅基地

文章浏览阅读1.1k次,点赞32次,收藏12次。我个人于2020年9月左右开始接触Godot,在2021年8月汉化一个关于GDScript脚本注释习惯的视频时,学习到了一些有用的代码注释规则,于是逐渐将一些注释习惯引入自己的代码书写中。这些注释习惯一直延续至今,并逐渐形成我自己的一种风格。本篇就来介绍一下我自己的注释习惯,以及谈谈这样做的好处。当然你并不需要完全和我一致,每个人都有自己的习惯。如果你觉得还有哪些好的提高代码可读性的好方法,可以留言或讨论。希望本篇内容对学习Godot的小伙伴们有用。_godot 注释

ChatGPT能测试用例,那么测试人员会被取代吗?_有人说chatgpt将会替代软件测试工程师(点工)-程序员宅基地

文章浏览阅读3.2k次。功能测试:检查用户名、密码、验证码的输入和校验,以及登录按钮的点击和跳转 性能测试:检查登录界面的加载速度,以及不同情况下的响应时间 界面测试:检查登录界面的布局、样式、字体、颜色等是否符合设计要求 安全性测试:检查是否有防止SQL注入、暴力破解、跨站脚本等攻击的措施 兼容性测试:检查在不同的浏览器、操作系统、分辨率下是否能正常显示和使用 可用性测试:检查是否支持Tab和Enter键,以及提示语是否友好 你想要我给你具体的例子吗?从功能覆盖率上说也没啥问题,基本的要点都有,而且异常情况也有比较多的覆盖。_有人说chatgpt将会替代软件测试工程师(点工)

Android 会议电话应用设计_android 三方通话无分离-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏10次。背景以下内容基于Android P code。 并以三方通话为例。合并通话IMS先看下合并通话后Call、Connection的变化:合并通话后Call Connection的变更1. 合并通话后把新的ImsCallSession给了原来的foreground的ImsCall,原来的两个ImsCallSession都断开了。合并通话后ImsCallSession..._android 三方通话无分离

解决 Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:XXXXXXX_存储过程 encountered unexpected token: ")" ")-程序员宅基地

文章浏览阅读2.2k次。解决 Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:XXXXXXX_存储过程 encountered unexpected token: ")" ")