java.lang.IllegalArgumentException:在请求目标中发现无效字符。有效字符在 RFC 7230 和 RFC 3986 中定义

问题描述 投票:0回答:10
java.lang.IllegalArgumentException: 
Invalid character found in the request target. 
The valid characters are defined in RFC 7230 and RFC 3986

该异常是由于Get URL中传递中文导致的。如何在 tomcat 中解决这个问题?

我们不想降低Tomcat版本并要求客户对参数进行编码。

有没有办法通过更改tomcat中的配置来解决这个问题?

tomcat
10个回答
9
投票

Tomcat 中无法修复此问题。这些请求不符合规范,因此 Tomcat 将不允许它们。系统中不同组件对此类 URL 的反应不同,安全问题由来已久。通常采用标头和/或请求注入的形式。这样一来,Tomcat 的 URL 解析就收紧了,放松的可能性微乎其微。

httpd 出于同样的原因正朝着相同的方向前进。

最好的长期选择是向客户端指出他们发送的请求不符合规范,他们需要修复它们(通过使用适当的 %nn 编码)。在 Tomcat 端,确保 Tomcat 使用 UTF-8。这是较新版本的默认设置。您可能需要在旧版本上显式设置它。


7
投票

看起来开箱即用的 Tomcat 不允许使用这些字符,正如您所看到的,浏览一下 this Question 似乎意味着您可以更改此行为,编辑

catalina.properties
并定义
requestTargetAllow
参数,如下所示:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

不幸的是,这看起来只是一长串您想要允许的字符,所以如果您希望所有中文字符都在那里,根据维基百科,您将有一个相当长的列表:

在使用简体字的中国,现代汉语 现代汉语常用字表、现代汉语常用字表 中文)列出了 2,500 个常用字符和 1,000 个非常用字符 字符,而 Xiàndài Hànyǔ Tōngyòng Zìbiǎo(现代汉语通用字表,Chart) 现代汉语常用字)列出了 7,000 个 字符,包括上面已列出的 3,500 个字符。


4
投票
Since spring boot 2.2.0 it is possible to configure Tomcat so, that special characters are allowed in URLs.

Just sum the ones you wanna allow in the application.properties

In your case that is

server.tomcat.relaxed-query-chars=|
all configurable chars are `, {, }, [, ], ^, <, > and |

In application.yml that would be

server:
  tomcat:
    relaxed-query-chars: ['{','}']

1
投票

在 AJAX GET 请求中发送文件位置时,我遇到了同样的错误。

错误:

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

由于该位置有无法识别的字符。 IE。 “C:///”等,抛出错误。

使用

encodeURIComponent
帮助我解决了这个问题,因为它对组件进行了编码。

当您传递汉字时,请确保将其添加到“

encodeURIComponent
”方法中。就我而言:

 $.ajax({
        type: "GET",
        url: 'removeFile?removeFileName=' + encodeURIComponent("C:///YO/Ed/PO/")
        data: {},
        dataType: 'json',

1
投票

较新版本的 tomcat 将不允许某些特殊字符。如果您使用 Spring Boot,您可以通过 tomcat 传递一个属性来允许您的特殊字符。

 server:
  tomcat:
    relaxed-query-chars: ['{','}']

1
投票

如果您尝试将 JSON 发送到请求目标,请先尝试对其进行编码

如果您使用 Postman 来测试微服务,请访问

https://onlinejsontools.com/url-encode-json

复制编码的 JSON 并将其粘贴到值的位置。 这解决了我的问题


1
投票

编辑您的 catalina.properties 并定义它:

server.tomcat.relaxed-path-chars=|,{,},[,]

0
投票

我遇到了同样的问题,但是使用GET传递数据,并且数据包含“|”特点。当使用POST时,TOMCAT没有出现同样的错误,但我无法给你解释。希望这对某人有用。


0
投票

尝试使用以下代码更改您的 server.xml 文件:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"  relaxedQueryChars="[,]()^`"/>

0
投票

对于 Spring Boot 3.2.0,在

application.properties
文件中添加以下属性可以解决我的问题

server.tomcat.relaxed-path-chars=<,>,[,\,],^,`,{,|,},:
server.tomcat.relaxed-query-chars=<,>,[,\,],^,`,{,|,},:
© www.soinside.com 2019 - 2024. All rights reserved.