当前位置: 首页 > 知识库问答 >
问题:

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

薄涵衍
2023-03-14

每当我尝试在 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类型的状态代码配置了一个公共页面,但问题是tomcat首先返回400错误请求http状态代码作为响应。

共有2个答案

施令秋
2023-03-14

从这里查看放松的路径查尔和放松的查询查尔https://tomcat.apache.org/tomcat-8.5-doc/config/http.html你需要将它们设置为所有不允许转义的先前字符

许俊晤
2023-03-14

如果需要允许字符,请将< code>relaxedQueryChars和/或< code>relaxedPathChars属性添加到server.xml文件中的< code>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

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

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

这个阀门的文档在这里:https://Tomcat . Apache . org/Tomcat-9.0-doc/config/Valve . html # Error _ Report _ Valve

 类似资料:
  • 我已经创建了一个MVC结构来为患者保存一个新的记录,我不断收到404错误。这是我的密码, 病人JAVA 控制器类 Dao实现类 调度servlet 耐心形成。jsp web.xml 我可以获取列表,但当我尝试从PatientForm保存患者详细信息时。jsp时,表单未将其提交给控制器,并给出400状态错误

  • 这是我的控制器 我的豆子是 当我给出的名称介于5到45个字符之间时,表单将被验证。但当表单未被验证时,我会收到400状态错误报告。我不知道为什么我会出错。这里需要帮助吗

  • 我正在尝试登录一个网站(https://dashboard.ngrok.com/user/login)使用jsoup。我对GET请求没有任何问题,但当我尝试使用凭证执行POST请求时,我收到: HTTP错误获取URL。状态=400 我尝试为请求设置一个更好的头,使用我在连接发出POST请求时发送的相同参数。 我也尝试过这种类型的请求: 结果显示: 线程“main”组织中出现异常。jsoup。Htt

  • 这里是LocationSearchMetaData.java 我的控制器 我的客户要求是这样的 下面是实际数据请求 获取时出错I:

  • 我在这个问题上花了很多时间,但无法解决它。请帮忙!当我从JSP提交表单时,我得到了这个错误。我的代码: 和我的控制器代码: }

  • 我有一个表单,用户可以使用它将文件上传到本地驱动器,还可以将一些数据保存到数据库中。但是出现了这个错误消息,我想知道如何处理它。 控制器 形式本身 我试图先保存表单,我将使用单独的方法发送它。