引言
当接口参数比较多的时候,后台一般会选择使用在Vo对象前加上 @RequestBody
来接收序列化的参数。然而有时候为了方便Web
,Android
以及IOS
,接口往往采用成 <K,V>
的方式,所有参数转成JSON格式放入V中,通过指定K来让后端接收,这时V值是类似 {"currentPage":1,"pageSize":2}
这种携带了 {}
特殊字符的,PostMan
请求后台接口会报错 The valid characters are defined in RFC 7230 and RFC 3986
网上资料
- RFC 3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
- RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
由此我知道是我的url中符号违反了RFC 3986和RFC 7230。
而且跟tomcat版本有关:我的项目使用的tomcat为:Tomcat8.5.39
而在Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。
解决方案
网上给的解决方案
(1)使用Tomcat7.0.69之前的版本;
(2)对url的特殊字符进行转义(做Aop切面,对url特殊字符做转义
)
(3)修改tomcat配置文件
这里就不再细述,读者可以自己去尝试。
下面我推荐一种超级方便的解决方案:Springboot
项目中我们直接加入如下配置即可:
package com.spring.security.demo.config;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author wulongbo
* @Date 2020/12/15 17:28
* @Version 1.0
* 配置Spring boot支持在查询参数中加{}[]字符。
*/
@Configuration
public class SystemConfig {
@Bean
public TomcatServletWebServerFactory containerFactory() {
return new TomcatServletWebServerFactory() {
protected void customizeConnector(Connector connector) {
int maxSize = 50000000;
super.customizeConnector(connector);
connector.setMaxPostSize(maxSize);
connector.setMaxSavePostSize(maxSize);
connector.setProperty("relaxedQueryChars", "[]{}");
if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol) {
((AbstractHttp11Protocol <?>) connector.getProtocolHandler()).setMaxSwallowSize(maxSize);
logger.info("Set MaxSwallowSize "+ maxSize);
}
}
};
}
}
启动Springboot项目
由于使用的Mybatis-Plus,很多借口为了方便直接写到了控制页面[苦涩
],简单写一个测试代码如下:
测试
Postman测试结果
使用 Postman
访问 localhost:8080/sysUser/getUserList
需要我们在Body
上带上tenantId
以及 spring security
权限认证的 token
再组装 Params
请求:
正确得到请求结果:
哈哈,是不是骚easy!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。