如何让 Tomcat 接受 URL 中未转义的括号?

Posted

技术标签:

【中文标题】如何让 Tomcat 接受 URL 中未转义的括号?【英文标题】:How can I make Tomcat accept unescaped brackets in URLs? 【发布时间】:2017-10-16 03:27:35 【问题描述】:

我以前从未使用过 Tomcat,但我最近继承了一个 JSP 项目,现在我需要让它运行。我已经设法在 Eclipse 中本地安装了 Tomcat 8.0,一切正常。我还在 Ubuntu VPS 上安装了 Tomcat 8.0。该应用程序运行良好,除了处理 URL 的方式存在一个小问题。

客户端应用程序在参数中生成带有非转义方括号和大括号的 URL,如下所示:

GET /saveItems.json?items=[%22json%22:%22here%22]

尽管我想更改客户端应用程序,但我不能。我只需要让这个后端运行起来。

我的本​​地应用程序副本可以很好地处理这个问题。但是,在服务器上,我收到此错误:

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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:286)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1504)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1460)
    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:748)

我一直在寻找可能会影响这一点的设置,但没有任何运气。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

Tomcat 8.0.39/8.5.9/7.0.73 在 HTTP 请求行解析中添加对有效字符的额外检查。 根据this requirement、version 8.0.42/8.5.12/7.0.76 进行一些更改以允许一些无效字符。| 如果系统属性值中存在字符则允许 tomcat.util.http.parser.HttpParser.requestTargetAllow.

您可以添加系统属性tomcat.util.http.parser.HttpParser.requestTargetAllow= 以防止出现此错误。一种解决方案是编辑$CATALINA_HOME\conf\catalina.properties

【讨论】:

在 tomcat 9.0.11 + tomcat.util.http.parser.HttpParser.requestTargetAllow 中不再使用。仅使用轻松查询字符。【参考方案2】:

我通过编辑 $CATALINA_HOME\conf\server.xml 使这个可行

旧值: <Connector ... protocol="HTTP/1.1"... />

新值: <Connector ... protocol="HTTP/1.1"... relaxedQueryChars='[]|^\`"<>' />

【讨论】:

您忘记包含值 我在 server.xml 文件中复制了上述内容以允许 #.But 仍然 tomcat 无法解析 url /跨度> 请注意,根据您的用例,您可能还想使用 RelaxedPathChars 而不是 RelaxedQueryChars。见vividcode.io/support-brackets-in-url-query-string-with-tomcat【参考方案3】:

当我尝试使用某些特殊字符 GET URL 时出现此错误。

java.lang.IllegalArgumentException:在 请求目标。

通过更改server.xml中的连接器参数, 我们能够在 Tomcat 版本 9 中解析一个特殊字符。

Connector port="80" protocol="HTTP/1.1" relaxedQueryChars="\   |" 

【讨论】:

【参考方案4】:

我也遇到了类似的问题,但也使用 Spring boot,以下解决方案解决了我的问题:

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

归功于Matthias-lohr - https://***.com/questions/46251131/invalid-character-found-in-the-request-target-in-spring-boot

【讨论】:

以上是关于如何让 Tomcat 接受 URL 中未转义的括号?的主要内容,如果未能解决你的问题,请参考以下文章

数据 URI 正文中未转义的“#”字符已弃用;如何在项目中找到?

如何让 Apache Tomcat 接受 DELETE 方法

springboot中URL带有斜杠的转义字符百分之2F导致的400错误

如何正确转义 JSP 标记中的三重嵌套引号

如何使用 Javascript RegExp 转义括号? [复制]

print()函数与转义字符