SpringBoot URL带有特殊字符([]/{}等),报400错误的解决

网友投稿 1143 2022-08-28


SpringBoot URL带有特殊字符([]/{}等),报400错误的解决

目录SpringBoot URL带有特殊字符([]/{}等),报400解决办法有两种,转义和配置Tomcat请求参数包含[]特殊符号的问题当参数含有特殊符号 [] 报错400

SpringBoot URL带有特殊字符([]/{}等),报400

今天使用springboot开发接口,版本——2.1.3.RELEASE,需要接收json格式的字符串数据,json串中只有大括号时还正常,没有400,但是在传json数组时,带有中括号[],拦截器都不进就直接400,经过一阵排查,json格式等都没有问题。

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

解决办法有两种,转义和配置Tomcat

转义字符就不说了,下面贴上2.1.3.RELEASE版本Springboot的配置方法:

@Configuration

public class XxxConfig {

@Bean

public ServletWebServerFactory webServerFactory() {

TomcatServletWebServerFactory fa = new TomcatServletWebServerFactory();

fa.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "[]{}"));

return fa;

}

}

请求参数包含[]特殊符号的问题

springBoot 版本 2.0.4.RELEASE

当参数含有特殊符号 [] 报错400

解决方案类似springMvc修改tomcat配置,springBoot 启动类中添加 bean

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;

import org.springframework.context.annotation.Bean;

@SpringBootApplication

public class SigncallbackApplication {

public static void main(String[] args) {

SpringApplication.run(SigncallbackApplication.class, args);

}

@Bean

public TomcatServletWebServerFactory tomcatServletWebServerFactory (){

// 修改内置http://的 tomcat 容器配置

TomcatServletWebServerFactory tomcatServlet = new TomcatServletWebServerFactory();

tomcatServlet .addConnectorCustomizers(

(TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "[]{}")

);

return tomcatServlet ;

}

}

XXXController1.java

import com.alibaba.fastjson.JSONObject;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.*;

/**

* @author: ma dengling

* @create: 2020-04-13 11:09

* @Desc:

*/

@RestController

@RequestMapping(value = {"/signcallback1"})

public class TpnHtqzLogController1 {

private static final Logger log = LoggerFactory.getLogger(TpnHtqzLogController1.class);

@RequestMapping(value = "/htqz_log")

public String htqzLog(String jsonString) {

log.info(jsonString);

JSONObject jsonObject = JSONObject.parseObject(jsonString);

String callBackAction = jsonObject.getString("action");

return callBackAction;

}

}

postman调用接口

控制台输出结果


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PyQt汇率兑换工具实现的代码,需要引用上一节写的DataMake类
下一篇:对python脚本readDataToDic脚本进行模块化拆分多个类(V1.0)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~