Invalid character found in the request target , 在SpringBoot2.0.3中的异常解决

解决Tomcat异常与SpringBoot兼容性问题
本文介绍了解决Tomcat中出现的“Invalid character found in method name”及“Invalid character found in the request target”两个异常的方法。通过调整Tomcat配置如maxHttpHeaderSize和使用relaxedQueryChars属性,确保了SpringBoot应用与Tomcat服务器的兼容性。

异常一:
    Invalid character found in method name. HTTP method names must be token
原因:
   产生这个问题的原因是页面表单提交了大量的数据,而这些数据量可能超过了Tomcat 定义的Header头内容,那么很好解决了,只要设置一下Tomcat的maxHttpHeaderSize

 解决问题如下:

server:
  address: 0.0.0.0
  port: 8080
  max-http-header-size: 10240000
  tomcat:
    max-http-header-size: 10240000
    max-http-post-size: 10240000                                                                                                                                                                  

 异常二:

        Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
原因:
     SpringBoot 2.0.0 以上都采用内置tomcat8.0以上版本,而tomcat8.0以上版本遵从RFC规范添加了对Url的特殊字符的限制,url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~四个特殊字符以及保留字符( ! * ’ ( ) ; : @ & = + $ , / ? # [ ] ) (26*2+10+4+18=84)这84个字符,请求中出现了{}大括号或者[],所以tomcat报错。设置RelaxedQueryChars允许此字符(建议),设置requestTargetAllows选项(Tomcat 8.5中不推荐)。您可以降级为旧版本之一(不推荐-安全性)。根据 https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html, requestTargetAllowis设置允许不受欢迎字符。对我来说,这里提出的其他解决办法也不起作用。根据Tomcat文档,我找到了一种方法来设置松弛的QueryChars属性

 解决问题如下:

/**
 *
解决异常信息:
 *  java.lang.IllegalArgumentException:
 *      Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
 * @return
 
*/

@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
    TomcatServletWebServerFactory factory =
new TomcatServletWebServerFactory();
   
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
       
@Override
       
public void customize(Connector connector) {
            connector.setProperty(
"relaxedQueryChars", "|{}[]");
       
}
    })
;
    return
factory;
}                                                                                                                                                                                                                    

 

### Java HTTP 请求中 `IllegalArgumentException` 异常问题的解决方案 当遇到 `java.lang.IllegalArgumentException: Invalid character found in the request target` 错误时,通常是因为请求的目标路径或参数包含了不符合标准的字符。这些字符违反了 RFC 7230 和 RFC 3986 的规定[^1]。 #### 原因分析 该错误的主要原因是客户端发送的 HTTP 请求中存在非法字符。具体来说: - 非法字符可能存在于 URL 路径、查询参数或头部字段中。 - 特定版本的服务器(如 Tomcat 8.5.x)对请求目标中的字符进行了更严格的校验[^4]。 - 如果 Cookie 中包含非法字符(例如 ASCII 控制字符),也可能触发此异常[^2]。 #### 解决方案 以下是几种常见的解决方法: 1. **编码处理** 对于传递的数据(特别是 JSON 字符串或其他复杂数据结构),应确保其经过适当的编码。可以使用 `URLEncoder.encode()` 方法来转义特殊字符。 ```java String encodedParam = URLEncoder.encode(paramValue, StandardCharsets.UTF_8.toString()); ``` 2. **调整 Tomcat 配置** 如果问题是由于 Tomcat 默认严格解析模式引起的,则可以通过修改配置文件降低解析严格度。编辑 `server.xml` 文件并设置以下属性: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars=&#39;|,<,>,`,{,},[,],",\\&#39; relaxedPathChars=&#39;|,<,>,`,{,},[,]," /> ``` 这里通过指定允许的额外字符集缓解部分兼容性问题。 3. **验证输入数据** 在接收任何外部输入之前增加一层过滤逻辑,剔除潜在危险字符。例如: ```java public static boolean isValidRequest(String input) { Pattern pattern = Pattern.compile("[^a-zA-Z0-9]"); Matcher matcher = pattern.matcher(input); return !matcher.find(); } ``` 4. **升级依赖组件** 若当前使用的框架或者库较旧,可能存在未修复的相关漏洞。建议及时更新至最新稳定版以获得更好的支持[^3]。 以上措施能够有效减少甚至完全消除此类运行期异常的发生概率。 ```java // 示例代码展示如何安全构建URL try { StringBuilder urlBuilder = new StringBuilder("http://example.com/api?"); Map<String, String> params = Map.of( "key1", "value with space", "key2", "another=value&more" ); for (Map.Entry<String, String> entry : params.entrySet()) { urlBuilder.append(URLEncoder.encode(entry.getKey(), "UTF-8")) .append("=") .append(URLEncoder.encode(entry.getValue(), "UTF-8")) .append("&"); } System.out.println(urlBuilder.substring(0, urlBuilder.length() - 1)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage(), e); } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值