【问题标题】:Not sure why sparkjava webservice is throwing 400 error on encoded date不知道为什么 sparkjava webservice 在编码日期抛出 400 错误
【发布时间】:2020-02-26 15:05:37
【问题描述】:

我正在传递这个网址:

"http://localhost:8080/services/getWeeksFromDate/2%2F25%2F2020" 

它会出现这个错误:

HTTP 状态 400 – 错误请求

类型状态报告

消息 URI 无效:noSlash

描述服务器不能或不会处理请求,因为某些东西被认为是 客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由)。

Apache Tomcat/9.0.7

即使我对日期进行 URL 编码,它也永远不会进入方法。

如果我通过“Hello”而不是上面的编码日期,它可以正常工作。

在实际的方法中,我只是试图返回传入的字符串——在我试图弄清楚这一点时没有处理。

Tomcat 日志中没有任何帮助。无法调试,因为这发生在方法代码之外。

希望有任何建议。

谢谢,

【问题讨论】:

    标签: spark-java


    【解决方案1】:

    这似乎是因为 Tomcat 在斜杠字符到达 Spark 之前就对其进行了解码,这是一种安全措施。

    您可以通过将系统属性 org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH 设置为 true 来禁用此行为(例如通过 Tomcat 的 catalina.properties)。

    【讨论】:

    • 谢谢,我试过了。但这样做似乎会为日期片段发送 / 字符。因此,如果我在日期中传入“2”,我会进入该方法并得到预期的错误。但是,如果我在日期中传递“2%2F25%2F2020”,我会收到 404 错误——我认为,这意味着“/”不知何故又回来了,它正在寻找一种不存在的方法。跨度>
    • 确实,看起来 Tomcat 在将 URI 传递给 Spark 之前仍然会解码这些内容。然后我看到 2 个选择:您可以对 URI 进行过度编码 - 将 % 字符转换为 %25,例如 2%252F25%252F2020 - 或者将 Spark 中的服务映射为 /services/getWeeksFromDate/:month/:day/:year。我设法同时使用 Tomcat 9 和 Spark 2.9。
    • 谢谢。我最终做的是,没有强迫用户使用 ISO 8601 格式,而是使用 Base64Encoding 而忘记了 Tomcat 的 UrlEncoding。不过,你的想法很棒,我会记住的。再次感谢。
    猜你喜欢
    • 2017-07-08
    • 2013-11-07
    • 2022-11-10
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2019-04-12
    • 2018-01-06
    • 1970-01-01
    相关资源
    最近更新 更多