在spring boot中请求目标中找到无效字符

rez*_*tin 19 spring-boot embedded-tomcat-8

我的应用程序是从java -jar开始的,版本为1.5.6.RELEASE的spring boot.
我的一个请求的内容具有字符"{".当它被发送到服务器时,引发以下异常:

java.lang.IllegalArgumentException:在请求目标中找到无效字符.有效字符在RFC 7230和RFC 3986中的org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472)中定义,位于org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:683)at at Org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:868)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor. doRun(NioEndpoint.java:1455)位于java.util的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)的org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) .concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)atg.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java) :745)

哪里错了?我如何解决它?

编辑1:
我的休息是这样的:

var jsonData = {
                    id: $("#hiddenId").val(),
                    permitNumber: $("#txtPermitNumber").val(),
                    permitToDate: $("#txtPermitToDate").val()
               }
document.location = restUrl + "/print?reportParams= " + JSON.stringify(jsonData);
Run Code Online (Sandbox Code Playgroud)

Mat*_*ohr 22

根据https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html,不推荐使用requestTargetAllow.对我来说,这里提出的其他解决方案也不起作用.根据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;
}
Run Code Online (Sandbox Code Playgroud)

  • 不确定“查找”是什么意思。这是 Java Bean 的代码。这里没有任何 Eclipse 相关的内容。 (2认同)

ali*_*ani 9

你会像这样启动你的Spring启动应用程序

$ java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
 demo-0.0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

或者像这样编码uri

document.location = restUrl + "/print?reportParams= " + encodeURI(JSON.stringify(jsonData));
Run Code Online (Sandbox Code Playgroud)


Pri*_*iit 6

对于 Spring Boot (2.X) 应用程序,只需添加到属性文件:

server.tomcat.relaxed-query-chars=|,{,},[,]
Run Code Online (Sandbox Code Playgroud)

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


Le *_*hau 6

如果您使用 application.yaml 只需添加以下配置

server:
  tomcat:
    relaxed-query-chars: '|,{,},[,]'
Run Code Online (Sandbox Code Playgroud)