web-dev-qa-db-fra.com

Caractère non valide trouvé dans la cible de la demande au démarrage de printemps

Mon application est démarrée avec Java -jar avec la version 1.5.6.RELEASE de Spring Boot.
Le contenu d'une de mes requêtes a le caractère "{" .Lorsqu'il est envoyé au serveur, l'exception suivante est levée:

Java.lang.IllegalArgumentException: caractère non valide trouvé dans la cible de la demande. Les caractères valides sont définis dans RFC 7230 et RFC 3986 sur org.Apache.coyote.http11.Http11InputBuffer.parseRequestLine (Http11InputBuffer.Java:472) sur org.Apache.coyote.http11.Http11Processor.service (Http11Processor) org.Apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.Java:66) sur org.Apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.Java:868) sur org.Apache.Tomcat.util.net.NioEndpoint $ SocketProcessor. doRun (NioEndpoint.Java:1455) sur org.Apache.Tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.Java:49) sur Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1142) sur Java.util .concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:617) sur org.Apache.Tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.Java:61) sur Java.lang.Thread.run (Thread.Java : 745)

Où est le mal? Comment je le répare?

EDIT1:
Mon repos est comme ceci:

var jsonData = {
                    id: $("#hiddenId").val(),
                    permitNumber: $("#txtPermitNumber").val(),
                    permitToDate: $("#txtPermitToDate").val()
               }
document.location = restUrl + "/print?reportParams= " + JSON.stringify(jsonData);
18
reza ramezani matin

Selon https://Tomcat.Apache.org/Tomcat-8.5-doc/config/systemprops.html , requestTargetAllow est obsolète. Pour moi, les autres solutions présentées ici n'ont pas fonctionné non plus. Selon la documentation Tomcat, j'ai trouvé un moyen de définir la propriété relaxQueryChars à la place:

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

vous allez démarrer votre application de démarrage Spring comme ceci

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

ou encoder uri comme ça

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

Un moyen facile d'ajouter simplement ce code dans votre classe principale

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

2
Jayendra Singh

Pour Spring Boot 1.5.17.RELEASE. Le code ci-dessous a fonctionné pour moi.

@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;
    }

}
0
Priya Nalang