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

时间:2017-09-16 07:03:29

标签: 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)     在   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)     在   org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)     在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)     在   org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     在java.lang.Thread.run(Thread.java:745)

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

EDIT1:
我的休息是这样的:

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

7 个答案:

答案 0 :(得分:16)

根据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;
}

答案 1 :(得分:7)

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

public function getItem($pk = null)
  {
    $data = parent::getItem((int)$pk);
    if (empty($data))
    {
       return false;
    }
    $childModel = JModelLegacy::getInstance('child', 'MycompModel');
    $rowChildren = $childModel->getChildrenByParentID((int)$data->get('id'));
    $childArray = [];
    for ($i = 0; $i < count($rowChildren); $i++)
    {
        $childArray['children'. $i] = [
            'name' => $rowChildren[$i]['name']
        ];
    }
    $data->set('children', $childArray);
    return $data;
}

或像这样编码uri

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

答案 2 :(得分:2)

只需在主类中添加此代码即可

post-session on-failure email

答案 3 :(得分:1)

对于Spring Boot(2.3)应用程序,只需将其添加到属性文件中即可:

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

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

答案 4 :(得分:0)

对于 Spring Boot 应用程序,在属性文件中包含此内容:

server.tomcat.additional-tld-skip-patterns=xercesImpl.jar,xml-apis.jar,serializer.jar,xml-apis.jar,jaxb-core.jar,jaxb-api.jar

答案 5 :(得分:-1)

对于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;
    }

}

答案 6 :(得分:-1)

在请求端将其编码为Base 64字符串,然后在控制器端将其解码。


编码

btoa(string)


解码:

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