【问题标题】:HttpURLConnection receiving a 405 but service is completedHttpURLConnection 收到 405 但服务已完成
【发布时间】:2013-07-24 08:20:33
【问题描述】:

我有一个在 Apache tomcat 环境中扩展 HttpServlet 的 servlet。

它有一个 doPost 覆盖。

我正在尝试使用 setDoOutput = true 通过 HttpURLConnection 进行访问。

客户端收到 405,但工作仍由 Tomcat 服务器执行,如 Tomcat 日志中的条目所示。

我确实在 httpd.conf 文件中找到了一个 Limit POST 并将其删除并重新启动了 Apache。

<Location /servlets>
   <Limit POST>
     Order deny,allow
     Deny from all
     Allow from localhost
     Satisfy any
   </Limit>
</Location>

同样的结果。

如果我将客户端更改为 GET,我会得到预期的 405,没有 doGet。

Apache 日志正确反映了客户端请求是 GET 还是 POST,具体取决于我发送的风格。

看来这确实应该是问题所在,但没有运气

还有其他地方可以看吗?

【问题讨论】:

  • HTTPD 配置与问题的相关性如何?您的 Tomcat 是否以带有 mod_jk 的 HTTPD 为前端?您是否暗示当您的 Tomcat 不是以 HTTPD 为前端而是直接连接时它可以正常工作?如果是这样,那么问题是由 HTTPD 引起的吗?在那种情况下,这不是程序员的问题,而只是服务器管理员的问题。然后您的问题应迁移到 serverfault.com。

标签: java apache http tomcat servlets


【解决方案1】:

HttpURLConnection 收到 405 但服务已完成

正如错误清楚地表明的那样,您似乎正在使用您的 servlet 不支持的 HTTP 方法。正如您所提到的,您的 servlet 仅覆盖了 doPost,因此它只能处理 POST 请求。而且您在发送请求时似乎正在使用其他一些 HTTP 方法。

【讨论】:

  • "HttpURLConnection with setDoOutput = true" 正如 OP 明确表示的那样,客户端使用了 POST。有关如何使用/理解 URLConnection 的详细教程,另请参阅 stackoverflow.com/questions/2793150/…
【解决方案2】:

感谢您的回复。我们有一个扩展 HttpServlet 的 A 类。所有这些都是其他 servlet B 的扩展 A,它们都隐式执行了 A 的超级。我试图通过让 B 直接扩展 HttpServlet 来摆脱 A。我没有注意到的是所有 B 都明确地执行了过去 A 的 super.doPost()。当 A 被省略时, super.doPost() 是 HttpServlet 的,这似乎导致了问题。一旦我删除了 super.doPost() 一切都开始按预期工作。

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 2017-12-29
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多