引言
当接口参数比拟多的时候,后盾个别会抉择应用在 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!