在Spring Boot中,请求目标中发现无效字符。

36
我的应用程序是使用版本为1.5.6.RELEASE的Spring Boot通过java -jar命令启动的。
我的一个请求内容中包含字符“{”。当发送到服务器时,将引发以下异常:
“java.lang.IllegalArgumentException:在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义”
有什么地方出了问题?我该如何解决?
EDIT1:
我的rest请求如下:
var jsonData = {
                    id: $("#hiddenId").val(),
                    permitNumber: $("#txtPermitNumber").val(),
                    permitToDate: $("#txtPermitToDate").val()
               }
document.location = restUrl + "/print?reportParams= " + JSON.stringify(jsonData);
9个回答

40
根据https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.htmlrequestTargetAllow已被弃用。对于我来说,这里提供的其他解决方案也没有起作用。根据Tomcat文档,我找到了一种设置属性relaxedQueryChars的方法:
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
        @Override
        public void customize(Connector connector) {
            connector.setProperty("relaxedQueryChars", "|{}[]");
        }
    });
    return factory;
}

在 Eclipse 中,我可以在哪里找到这个配置?@Matthias Lohr - user8108863
2
不确定您所说的“查找”是什么意思。这是Java Bean的代码。这里与Eclipse无关。 - Matthias Lohr
谢谢,这个配置对我非常有效。 - Nguyen Minh Hien

17

对于一个Spring Boot应用程序,只需将其添加到属性文件中:

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

还有以下关键字:server.tomcat.relaxed-path-chars

11

你可以像这样启动你的Spring Boot应用程序

$ java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
 demo-0.0.1-SNAPSHOT.jar

或者像这样编码 URI

document.location = restUrl + "/print?reportParams= " + encodeURI(JSON.stringify(jsonData));

1
大汉网服务:D - Rasool Ghafari
1
对我无效,在Spring Boot 2.x中似乎被忽略了。 - Matthias Lohr

6

如果您使用application.yaml,请添加以下配置

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

1

只需在主类中添加以下代码即可:

System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "{}");


1
对我也不起作用,在Spring Boot 2.x中似乎被忽略了。 - Matthias Lohr

1

对于一个Spring Boot应用程序,可以在属性文件中添加以下内容:

server.tomcat.additional-tld-skip-patterns=xercesImpl.jar,xml-apis.jar,serializer.jar,xml-apis.jar,jaxb-core.jar,jaxb-api.jar


1

对于SpringBoot 1.5.17.RELEASE版本,以下代码适用于我。

@Configuration
public class ServerConfig {

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

}

2
最好用户也给出投票反对的原因。 - Priya Nalang
我没有对这篇帖子投票。我怀疑,这可能是由于投票者使用了Spring Boot 2而导致的投票失败。但不用担心,赞比踩强5倍。如果你的解决方案能够为我所用,我会给它点赞的。 - peterh

0

我遇到了同样的问题,对我来说,问题是通过将@GetMapping替换为@PostMapping解决的。


-1

在请求端对它进行Base64字符串编码,然后在控制器端进行解码。


编码

btoa(string)


解码:

String arr = request.getParameter();
arr = new String(Base64.getDecoder().decode(arr))

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