引言

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

网上材料

  1. RFC 3986文档规定,Url中只容许蕴含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
  2. 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反对在查问参数中加{}[]字符。 */@Configurationpublic 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!