解决SpringBoot 报错 Error parsing HTTP request header

摘要:
使用内置tomcat1和问题描述接收应用程序/x-wwww-form-urlencodedPost参数data={“data”:。

一、SpringBoot 项目,使用自带tomcat

1、问题描述

接收 application/x-www-form-urlencoded Post

参数 data={"data":[{"id_dev":"CSB000001","state":"online","on_ts":1526004805}, {"id_dev":"CSB000001","state":"online","on_ts":1526004805,"off_ts":1526004810}]}

报错:

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

解决SpringBoot 报错 Error parsing HTTP request header第1张

2、原因分析

导致上述问题是因为tomcat自8.5.x系列的:8.5.12 之后版本、8.0.x系列的:8.0.42 之后版本、7.0.x系列的:7.0.76 之后版本对URL参数做了比较规范的限制,必须遵循RFC 7230 and RFC 3986规范,对于非保留字字符(json格式的请求参数)必须做转义操作,否则会抛出Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986错误信息。就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

3、解决方法

1)降低tomcat版本,不推荐

2)在SpringBoot工程中增加一个tomcat 配置,配置文件代码如下

@Configuration
public class TomcatConfigurer {

    @Bean
    public TomcatServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((Connector connector) -> {
            connector.setProperty("relaxedPathChars", ""<>[\]^`{|}");
            connector.setProperty("relaxedQueryChars", ""<>[\]^`{|}");
        });
        return factory;
    }

}

参考:https://www.jianshu.com/p/75eec24321e7

二、SpringBoot 项目,部署独立tomcat

1、同样问题

2、解决方法

参考:https://developer.aliyun.com/article/641394

在conf/catalina.properties中最后添加2行:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

该方式,在所有Tomcat版本均适用。

解析:在执行请求时,碰到该没问题的,大多是在URL中传输Json等。尤其是用浏览器地址输入的URL死活不能包含有任何特殊字符。否则会返回400 状态码。

首先:不推荐降低tomcat版本,这等于掩耳盗铃,绝对得不偿失。
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,在http解析时做了严格限制。
RFC3986文档规定,请求的Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

如果要使用这些特殊字符,并不是绝对不可以。Tomcat做了限制的同时,也提供了相关配置。给出的解决方案第一行requestTargetAllow,指定了允许的特殊字符,在等号后面配|{}就行了。

如果你需要使用这三个字符,配置到此就OK了。重启tomcat,rebuild工程再启动,就能正常使用了。

不幸的是, requestTargetAllow 只能配置|、{、} 允许这三个字符,对于其他的(例如" < > [ ] ^ ` { | } .),在请求时,仍然拦截,如果使用了|{}之外的其他字符那怎么办呢?那就还需要如下配置。

在conf/server.xml中的<Connector>节点中,添加2个属性:

relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"

这2个属性,可以接收任意特殊字符的组合,根据需要可以自行增减。

参考文档:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html

免责声明:文章转载自《解决SpringBoot 报错 Error parsing HTTP request header》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Let’s Encrypt配置ssl证书自动更新mongoRepository mongoTemplate下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多串匹配

meteor多串匹配 Description Input 第一行为一个整数n,表示文本的长度 第二行为一个长度为n的文本 第三行为一个整数m,表示模式串个数 下接m行,每行一个模式串  Output 共m行,若第i个模式串在文本中出现过则第i行输出YES,否则输出NO 数据范围 对于30%的数据,n<=10^3,m<=10^3; 对于80%的数...

QGis2.9在windows下的编译以及二次开发包下载

https://blog.csdn.net/deirjie/article/details/48216773 今天心血来潮,将QGis在github上的代码更新后,又编译了一下。留意到源代码包里面的INSTALL文件有更新,于是本次编译完全基于官方的编译说明。编译过程非常顺利,除了在CMake的第一次configure的时候弹出了一个小错误外,后续的工程生...

antd移动端onClick事件点击无效

  最近空余时间比较多,自己想学习react跟移动端的东西,就选用了antd-mobile库,框架搭好开发过程中遇到个问题,里面绑定的点击事件无效,不仅是antd自带的按钮无效,原生button点击也没反应,网上找了一大堆没有好的解决方案。在调试过程中发现 原来是我在设置底部导航的时候,把内容部分遮挡了,所以肯定点击没反应,解决方案把底部导航加个z-in...

如何在64位Win7下使用震动手柄

      我有一个北通的c033手柄,买的比较早了,只有winxp的驱动,在64位的Win7下只能当成普通手柄来用,没有震动了。google了很久才知道,原来Win7只支持微软自家产的XBOX360手柄,现在很多新的游戏如SineMora,也都只支持XBOX360手柄。一个无线的XBOX360手柄加上一个蓝牙接收器至少需要300块,确实有点贵啊!    ...

在oracle中自动大批量生成测试数据

方法1: SQL> create table b as select 1 id from dual connect by level<=100;    方法2:   SQL> create table a (id int);   Table created.   SQL> insert into a select 1 from d...

postman_03_引用随机变量($guid,$timestamp,$randomInt)_and_参数引用外部文件

在接口测试中,有些接口的请求参数具有唯一性,比如注册接口,注册一个账号后就不能重复注册了。为了能重复执行这个接口,可以在请求前清理测试数据,也可以把请求的参数设置成一个可变的值(每次不一样),这样就可以每次都能注册成功了。 使用动态变量 postamn 提供可在请求中使用的动态变量: {{$guid}} :v4样式的         {{$guid}} ...