在 Spring Boot 的请求目标中发现无效字符

hsvhsicv  于 2023-01-20  发布在  Spring
关注(0)|答案(9)|浏览(252)

我的应用程序是用java-jar启动的,版本为1. 5. 6. release的spring boot。
我的一个请求的内容有字符"{"。当它被发送到服务器时,引发了以下异常:
java. lang.非法参数异常: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义,网址为org.apache.coyote。http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472)网址为org.apache.coyote。Http11Processor.service(Http11Processor.java:683)网址为org.apache.coyote。抽象处理器光.进程(抽象处理器光. java:66)网址为org.apache.coyote。抽象协议$ConnectionHandler.进程(抽象协议. java:868)网址为org.apache.tomcat. util. net。NioEndpoint $套接字处理器. doRun(NioEndpoint.java:1455)网址为www.example.com(套接字 org.apache.tomcat.util.net.SocketProcessorBase.run (Socket ProcessorBase.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)
哪里出问题了?我该怎么解决?
编辑1:
我的休息是这样的:

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

9udxz4iz1#

根据https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.htmlrequestTargetAllow 已被弃用。对我来说,这里提供的其他解决方案也不起作用。根据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;
}
az31mfrm

az31mfrm2#

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

server.tomcat.relaxed-query-chars=|,{,},[,]

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

eimct9ow

eimct9ow3#

您将像这样启动Sping Boot 应用程序

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

或者像这样编码URI

document.location = restUrl + "/print?reportParams= " + encodeURI(JSON.stringify(jsonData));
lg40wkob

lg40wkob4#

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

server:
  tomcat:
    relaxed-query-chars: '|,{,},[,]'
ijxebb2r

ijxebb2r5#

简单的方法是将此代码添加到主类中
System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "{}");

siv3szwd

siv3szwd6#

对于SpringBoot 1.5.17.RELEASE.下面的代码为我工作.

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

}
9rnv2umw

9rnv2umw7#

对于Sping Boot 应用程序,在属性文件中包含以下内容:
jaxb-api. jar,xml-apis.jar,序列化程序.jar,xml-apis. jar,jaxb-core.jar,jaxb-api.jar

olqngx59

olqngx598#

我也面临着同样的问题,对我来说,这个问题通过将@GetMapping替换为@PostMapping得到了解决。

dgiusagp

dgiusagp9#

在请求端将其编码为Base64字符串,在控制器端将其解码。
编码
btoa(string)
解码:

String arr = request.getParameter();
arr = new String(Base64.getDecoder().decode(arr))

相关问题