gpt4 book ai didi

当我尝试在 URL 中发送特殊字符时,Tomcat 返回 HTTP 状态 400 – 错误请求状态

转载 作者:行者123 更新时间:2023-11-28 22:24:39 61 4
gpt4 key购买 nike

每当我尝试在 Mozilla Firefox 浏览器中将特殊字符放入 URL 中时

https://URL/|

https://URL/]

Tomcat 正在返回 HTTP 状态 400 – 错误请求和异常堆栈跟踪如下。

Type Exception Report

Message Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

Exception

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:474)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:294)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)

Note The full stack trace of the root cause is available in the server logs.

令人惊讶的是,带有特殊字符的相同 URL 在 Google Chrome 浏览器中可以正常工作。

我有以下问题

  1. 我应该在 tomcat 配置文件中做哪些更改才能使其不返回 400 状态代码和异常堆栈跟踪?
  2. 为什么 Mozilla Firefox 无法对 URL 进行编码?

注意:我已经在部署在 tomcat 9 上的应用程序中为类型 4XX 的状态代码配置了一个公共(public)页面,但问题是 tomcat 首先返回 400 错误请求 http 状态代码作为响应。

最佳答案

选项 1 - 允许字符:

如果需要允许字符,请将 relaxedQueryChars 和/或 relaxedPathChars 属性添加到 server.xml 文件中的 Connector 元素.像这样的东西:

<Connector port="8080" protocol="HTTP/1.1"
relaxedQueryChars="[]{}^|"
relaxedPathChars="[]{}^|"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443"/>

这些属性的文档在这里:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation

选项 2 - 不错的错误页面:

如果你想禁止这些字符,但显示一个漂亮的错误页面而不是堆栈跟踪,请将错误报告阀添加到 server.xml 中的 Host 元素。像这样的东西:

<Valve className="org.apache.catalina.valves.ErrorReportValve"
errorCode.400="webapps/ROOT/server_error.html"/>

Valve 的文档在这里:https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Error_Report_Valve

关于当我尝试在 URL 中发送特殊字符时,Tomcat 返回 HTTP 状态 400 – 错误请求状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52810433/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com