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 server the following exception is raised:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:683) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
Where is wrong? How do I fix it?
EDIT1:
My rest is like this:
var jsonData = { id: $("#hiddenId").val(), permitNumber: $("#txtPermitNumber").val(), permitToDate: $("#txtPermitToDate").val() } document.location = restUrl + "/print?reportParams= " + JSON.stringify(jsonData);
Since the location had characters which are not recognized. I.e. "C:///" etc, the error was thrown. The use of encodeURIComponent helped me fix the issue since it encodes the component.
To allow illegal or invalid chars in a request in Spring Boot, we need to set the “relaxedQueryChars” config. We can do that in two ways: Defining the ConfigurableServletWebServerFactory bean in the configuration. Adding the environment variable to the property file.
The valid characters are defined in RFC 7230 and RFC 3986 Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
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; }
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With