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

19
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配置来解决这个问题?

9个回答

9

在Tomcat中没有办法解决这个问题。这些请求不符合规范,所以Tomcat不会允许它们。系统中的不同组件对这些URL做出不同反应的安全问题已经存在了很长时间。通常是头部和/或请求注入的形式。因此,Tomcat的URL解析已经得到加强,并且极不可能被放松。

出于同样的原因,httpd也朝着相同的方向发展。

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


7

看起来Tomcat默认情况下不允许这些字符。如您在此问题中所见,可以通过编辑catalina.properties文件并定义requestTargetAllow参数来改变这种行为,具体操作如下:

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

很不幸,看起来这只是一个你想允许的字符的长列表,所以如果你想要所有的中文字符都在里面,你需要列出一个相当长的列表,根据维基百科的说法:
在使用简体中文字符的中国,现代汉语常用字表列出了2500个常用字符和1000个非常用字符,而现代汉语通用字表则包括7000个字符,其中已经包括上述3500个字符。

我已经阅读了Tomcat源代码,我知道这个参数是用于一些特殊字符的。 - Raw

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
如果您正在尝试将JSON发送到请求目标,请先对其进行编码。
如果您正在使用Postman测试微服务,则可以前往。

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

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

1
新版本的tomcat不允许使用某些特殊字符。如果您正在使用Spring Boot,您可以通过向tomcat传递属性来允许使用您的特殊字符。
 server:
  tomcat:
    relaxed-query-chars: ['{','}']

请求 URI 中没有花括号。 - Thomas Weber

1
我遇到了同样的错误,当发送一个文件的位置在 AJAX GET 请求中时。
错误:
java.lang.IllegalArgumentException: 
Invalid character found in the request target. 
The valid characters are defined in RFC 7230 and RFC 3986

由于位置中包含未被识别的字符,例如 "C:///" 等,因此引发了错误。

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

当您传递中文字符时,请确保将其添加到 "encodeURIComponent" 方法中。在我的情况下:

 $.ajax({
        type: "GET",
        url: 'removeFile?removeFileName=' + encodeURIComponent("C:///YO/Ed/PO/")
        data: {},
        dataType: '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="[,]()^`"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接