【问题标题】:Why is this URL returning error 400 from Tomcat?为什么这个 URL 从 Tomcat 返回错误 400?
【发布时间】:2016-03-25 13:19:37
【问题描述】:

我有一个运行 Java servlet 的 Tomcat 服务器。我正在尝试制作一个 servlet,它返回存储的文件,给定它们的加密 ID。

ID:100

加密 ID:+e4/E5cR/aM=

URL 编码 ID:%2Be4%2FE5cR%2FaM%3D

结果网址:http://localhost/file/demo/%2Be4%2FE5cR%2FaM%3D

当我尝试点击该链接时,我什至没有进入我的 servlet 代码 - 服务器返回此错误:加载资源失败:服务器响应状态为 400(错误请求)强>

这个 URL 有什么问题导致 Tomcat 在到达我的代码之前拒绝它?我通过 URL 编码器运行它,但我没有看到任何无效字符。

【问题讨论】:

  • 该 URL 可能是正确的,这取决于您如何配置 tomcat 和 web 应用程序。这个 URL 真的映射到 servlet 了吗?

标签: java tomcat url servlets


【解决方案1】:

您在网址中编码了斜线“/”。由于潜在的攻击,Apache 不允许使用它们。有设置允许他们:

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

查看类似的post

【讨论】:

  • 对于任何感兴趣的人,我决定放弃加密的 ID 并将其替换为保存到数据库中的随机生成的令牌。感谢您的提示。
  • 您好,请问在哪里可以修改这些参数?谢谢
  • 启动JVM时可以提供-D,看答案-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true,也可以在代码中设置属性。答案有它
  • 你也可以将org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true添加到conf/catalina.properties,这可能是最好的方法。
【解决方案2】:

您可能遇到以下两个问题之一:

1) 您的 URL 中没有包含端口。要么你已经将 Tomcat 端口配置为 80 端口,在这种情况下不需要该端口,要么你需要包含端口,默认为 8080,例如:

http://localhost:8080/file/demo/%2Be4%2FE5cR%2FaM%3D

2) 您将加密的 ID 添加为 URL 本身的一部分,这必须在您的 URL 映射中映射到某种 Servlet/JSP/View 并且不太可能。 Tomcat 不会识别唯一 ID 并知道调用相应的处理程序来处理映射。假设您打算调用映射到 '/file/demo' 的 servlet/JSP/controller,您更可能希望将 ID 作为请求参数传递,例如:

http://localhost:8080/file/demo?id=%2Be4%2FE5cR%2FaM%3D

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多