My application is started with java -jar with version 1.5.6.RELEASE of spring boot.
The content of one of my request has the character \"{\".When it is sended to serve
you will start your Spring boot app like this
$ java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
demo-0.0.1-SNAPSHOT.jar
or encode uri like this
document.location = restUrl + "/print?reportParams= " + encodeURI(JSON.stringify(jsonData));
Easy way just add this code in your main class
System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "{}");
According to https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html, requestTargetAllow is deprecated. For me, the other solutions presented here did not work either. According to the Tomcat documentation I found a way to set the property relaxedQueryChars instead:
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setProperty("relaxedQueryChars", "|{}[]");
}
});
return factory;
}
For SpringBoot 1.5.17.RELEASE. The below code worked for me.
@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;
}
}
For a Spring Boot (2.3) application, just add to properties file:
server.tomcat.relaxed-query-chars=|,{,},[,]
There is also the following key: server.tomcat.relaxed-path-chars
Encode it to Base 64 string at request end and decode it at the controller end.
Encode
btoa(string)
Decode:
String arr = request.getParameter();
arr = new String(Base64.getDecoder().decode(arr))