Exception之The valid characters are defined in RFC 7230 and RFC 3986

解决JSON参数引发的HTTP400错误
本文介绍了一种常见的HTTP400错误,该错误发生在将JSON格式的参数通过URL传递时。详细解释了错误产生的原因,并提供了解决方案,包括使用JavaScript中的encodeURIComponent方法来正确编码URL参数。

问题描述:
程序部署到window上可以成功运行,但是部署到Linux上报错。火狐调试显示400错误。程序使用http get请求并带json格式参数。

[org.springframework.security.web.context.SecurityContextPersistenceFilter:97]-[DEBUG] -- SecurityContextHolder now cleared, as request processing completed

Feb 17, 2017 11:42:39 AM org.apache.coyote.http11.AbstractHttp11Processor process

INFO: Error parsing HTTP request header

 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

解决方案:
RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

RFC3986中指定了以下字符为保留字符:

!   *   '   (   )   ;   :   @   &   =   +   $  ,   /   ?   #   [   ]

还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
不安全字符有:

->空格    Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉

->引号以及<>    引号和尖括号通常用于在普通文本中起到分隔Url的作用

-># 通常用于表示书签或者锚点

->% 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码

->{}|\^[]`~    某一些网关或者传输代理会篡改这些字符

此处就是json格式的参数在地址栏传递过程中转义出了问题,一半地址中传递的参数含有中文也遇到了此异常。可以对字符串进行编码解决此问题。js编码的函数有: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 。

其中escape()除了 ASCII 字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法,而encodeURI()用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。

@PostMapping(value = "/compare",consumes = "multipart/form-data") public R compare(@RequestParam("File") MultipartFile file, @RequestParam("jsonContent") String jsonContent) { //读取PDF文本 String pdfText = compareService.extractContent(file); //解析JSON配置 JsonNode jsonConfig = null; try { jsonConfig = compareService.parseJson(jsonContent); } catch (Exception e) { return R.fail(MessageUtils.message("failed.convert.json")); } //执行对比校验 List<ValidationResult> results = compareService.compareContent(pdfText, jsonConfig); //返回没有匹配成功的数据 List<ValidationResult> failedResults = new ArrayList<>(); for (ValidationResult result : results) { if (!result.isValid()) { failedResults.add(result); } } if (failedResults.isEmpty()) { return R.ok("条件符合规范"); } else { return R.ok(failedResults); } }我在apifox这个软件测试 报错java.lang.IllegalArgumentException: Invalid character found in the request target [/pdfJson/compare?jsonContent=[%20%20%7B%20%20%20%20%22DELIVERYNO%22:%20%22QBA7074052%22,%20%20%20%20%22CARRIERCODE%22:%20%22XDESC%22,%20%20%20%20%22SHIPCONDITDESC%22:%20%22ROAD%22,%20%20%20%20%22SOLDTONAME%22:%20%22%E6%B7%B1%E5%9C%B3%E5%B8%82%E5%A4%A9%E8%81%94%E7%BB%88%E7%AB%AF%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%22,%20%20%20%20%22SOLDTOCOMPANY%22:%20%22%22,%20%20%20%20%22SHIPTONAME%22:%20%22%E6%B7%B1%E5%9C%B3%E5%B8%82%E5%A4%A9%E8%81%94%E7%BB%88%E7%AB%AF%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E4%B8%8A%E6%B5%B7%E5%BA%93%22,%20%20%20%20%22SHIPTOCOMPANY%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS%22:%20%22%E5%98%89%E5%AE%9A%E5%8C%BA%E5%85%B4%E9%82%A6%E8%B7%AF1166%E5%8F%B7%22,%20%20%20%20%22SHIPTOADDRESS2%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS3%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS4%22:%20%22%22,%20%20%20%20%22SHIPTOCITY%22:%20%22%E4%B8%8A%E6%B5%B7%22,%20%20%20%20%22SHIPTOSTATE%22:%20%22%E4%B8%8A%E6%B5%B7%22,%20%20%20%20%22SHIPTOZIP%22:%20201800,%20%20%20%20%22SHIPTOCOUNTRY%22:%20%22%E4%B8%AD%E5%9B%BD%22,%20%20%20%20%22SHIPINSTRUCT%22:%20%22%22,%20%20%20%20%22CUSTWHINST%22:%20%22%22,%20%20%20%20%22EXCUSTNOTE%22:%20%22%22,%20%20%20%20%22EXCUSTNOTE1%22:%20%22%22,%20%20%20%20%22SHIPDATE%22:%20%2213-MAY-2025%22,%20%20%20%20%22SOLDTOADDRESS%22:%20%22%E5%89%8D%E6%B9%BE%E4%B8%80%E8%B7%AF1%E5%8F%B7A%E6%A0%8B201%E5%AE%A4%22,%20%20%20%20%22SOLDTOADDRESS3%22:%20%22%22,%20%20%20%20%22SOLDTOADDRESS2%22:%20%22%22,%20%20%20%20%22SOLDTOCITY%22:%20%22%E6%B7%B1%E5%9C%B3%22,%20%20%20%20%22SOLDTOADDRESS4%22:%20%22%22,%20%20%20%20%22SOLDTOSTATE%22:%20%22%E5%B9%BF%E4%B8%9C%22,%20%20%20%20%22SOLDTOZIP%22:%20518000,%20%20%20%20%22SOLDTOCOUNTRY%22:%20%22%E4%B8%AD%E5%9B%BD%22,%20%20%20%20%22TOTALCARTONQTY%22:%2020,%20%20%20%20%22TOTALQTY%22:%20160,%20%20%20%20%22TOTALWEIGHT%22:%20%2273.94%20KGS%22,%20%20%20%20%22V_CUBE%22:%200.22%20%20%7D] ]. The valid characters are defined in RFC 7230 and RFC 3986 后端
07-10
@PostMapping(value = "/compare",consumes = "multipart/form-data") public R compare(@RequestParam("File") MultipartFile file, @RequestParam("jsonContent") String jsonContent) { //读取PDF文本 String pdfText = compareService.extractContent(file); //解析JSON配置 JsonNode jsonConfig = null; try { jsonConfig = compareService.parseJson(jsonContent); } catch (Exception e) { return R.fail(MessageUtils.message("failed.convert.json")); } //执行对比校验 List<ValidationResult> results = compareService.compareContent(pdfText, jsonConfig); //返回没有匹配成功的数据 List<ValidationResult> failedResults = new ArrayList<>(); for (ValidationResult result : results) { if (!result.isValid()) { failedResults.add(result); } } if (failedResults.isEmpty()) { return R.ok("条件符合规范"); } else { return R.ok(failedResults); } }为什么我在apifox这个软件测试报错java.lang.IllegalArgumentException: Invalid character found in the request target [/pdfJson/compare?jsonContent=[%20%20%7B%20%20%20%20%22DELIVERYNO%22:%20%22QBA7074052%22,%20%20%20%20%22CARRIERCODE%22:%20%22XDESC%22,%20%20%20%20%22SHIPCONDITDESC%22:%20%22ROAD%22,%20%20%20%20%22SOLDTONAME%22:%20%22%E6%B7%B1%E5%9C%B3%E5%B8%82%E5%A4%A9%E8%81%94%E7%BB%88%E7%AB%AF%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%22,%20%20%20%20%22SOLDTOCOMPANY%22:%20%22%22,%20%20%20%20%22SHIPTONAME%22:%20%22%E6%B7%B1%E5%9C%B3%E5%B8%82%E5%A4%A9%E8%81%94%E7%BB%88%E7%AB%AF%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E4%B8%8A%E6%B5%B7%E5%BA%93%22,%20%20%20%20%22SHIPTOCOMPANY%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS%22:%20%22%E5%98%89%E5%AE%9A%E5%8C%BA%E5%85%B4%E9%82%A6%E8%B7%AF1166%E5%8F%B7%22,%20%20%20%20%22SHIPTOADDRESS2%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS3%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS4%22:%20%22%22,%20%20%20%20%22SHIPTOCITY%22:%20%22%E4%B8%8A%E6%B5%B7%22,%20%20%20%20%22SHIPTOSTATE%22:%20%22%E4%B8%8A%E6%B5%B7%22,%20%20%20%20%22SHIPTOZIP%22:%20201800,%20%20%20%20%22SHIPTOCOUNTRY%22:%20%22%E4%B8%AD%E5%9B%BD%22,%20%20%20%20%22SHIPINSTRUCT%22:%20%22%22,%20%20%20%20%22CUSTWHINST%22:%20%22%22,%20%20%20%20%22EXCUSTNOTE%22:%20%22%22,%20%20%20%20%22EXCUSTNOTE1%22:%20%22%22,%20%20%20%20%22SHIPDATE%22:%20%2213-MAY-2025%22,%20%20%20%20%22SOLDTOADDRESS%22:%20%22%E5%89%8D%E6%B9%BE%E4%B8%80%E8%B7%AF1%E5%8F%B7A%E6%A0%8B201%E5%AE%A4%22,%20%20%20%20%22SOLDTOADDRESS3%22:%20%22%22,%20%20%20%20%22SOLDTOADDRESS2%22:%20%22%22,%20%20%20%20%22SOLDTOCITY%22:%20%22%E6%B7%B1%E5%9C%B3%22,%20%20%20%20%22SOLDTOADDRESS4%22:%20%22%22,%20%20%20%20%22SOLDTOSTATE%22:%20%22%E5%B9%BF%E4%B8%9C%22,%20%20%20%20%22SOLDTOZIP%22:%20518000,%20%20%20%20%22SOLDTOCOUNTRY%22:%20%22%E4%B8%AD%E5%9B%BD%22,%20%20%20%20%22TOTALCARTONQTY%22:%2020,%20%20%20%20%22TOTALQTY%22:%20160,%20%20%20%20%22TOTALWEIGHT%22:%20%2273.94%20KGS%22,%20%20%20%20%22V_CUBE%22:%200.22%20%20%7D] ]. The valid characters are defined in RFC 7230 and RFC 398 这个是报错信息 这个是我的json数据[ { "DELIVERYNO": "QBA7074052", "CARRIERCODE": "XDESC", "SHIPCONDITDESC": "ROAD", "SOLDTONAME": "深圳市天联终端有限公司", "SOLDTOCOMPANY": "", "SHIPTONAME": "深圳市天联终端有限公司上海库", "SHIPTOCOMPANY": "", "SHIPTOADDRESS": "嘉定区兴邦路1166号", "SHIPTOADDRESS2": "", "SHIPTOADDRESS3": "", "SHIPTOADDRESS4": "", "SHIPTOCITY": "上海", "SHIPTOSTATE": "上海", "SHIPTOZIP": 201800, "SHIPTOCOUNTRY": "中国", "SHIPINSTRUCT": "", "CUSTWHINST": "", "EXCUSTNOTE": "", "EXCUSTNOTE1": "", "SHIPDATE": "13-MAY-2025", "SOLDTOADDRESS": "前湾一路1号A栋201室", "SOLDTOADDRESS3": "", "SOLDTOADDRESS2": "", "SOLDTOCITY": "深圳", "SOLDTOADDRESS4": "", "SOLDTOSTATE": "广东", "SOLDTOZIP": 518000, "SOLDTOCOUNTRY": "中国", "TOTALCARTONQTY": 20, "TOTALQTY": 160, "TOTALWEIGHT": "73.94 KGS", "V_CUBE": 0.22 } ] 哪里有问题
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值