Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invalid character found in the request target in spring boot

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); 
like image 426
reza ramezani matin Avatar asked Sep 16 '17 07:09

reza ramezani matin


People also ask

How do you fix the valid characters are defined in RFC 7230 and RFC 3986?

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.

How do I add relaxedQueryChars to my spring boot?

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.

Are defined in RFC 7230 and RFC 3986?

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).


2 Answers

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; } 
like image 68
Matthias Lohr Avatar answered Sep 25 '22 08:09

Matthias Lohr


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)); 
like image 35
ali akbar azizkhani Avatar answered Sep 21 '22 08:09

ali akbar azizkhani