Java Servlet返回错误405(方法不允许)的POST请求

6

我的服务器可以正常处理GET请求,但是当我调用POST请求(使用jQuery Ajax $.post)时,会出现405错误(方法不允许)

这是我的代码:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class init extends HttpServlet {
    public init() { }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();
        out.println("GET");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, IllegalStateException {
        response.setContentType("application/json");
        ServletInputStream in = request.getInputStream();
        PrintWriter out = response.getWriter();
        out.print("POST");
    }
}

可能是doPost根本没有被调用。您可以尝试使用Chrome的Postman或Advanced Rest客户端进行测试和调试。您可以检查Tomcat的访问日志,看看请求的样子。 - DavidC
@DavidC 日志只显示了405和日期。我无法测试客户端是否调用了doPost。 - jcubic
2个回答

17

当我调用方法"super.doGet(req, resp)"或"super.doPost(req, resp)"时,发生了这种情况。

之后我从doGet和doPost中删除了上述的超类调用,它就正常工作了。

实际上,这些超类调用代码是由Eclipse IDE模板插入的。


2
这是不同的问题。 - jcubic
1
这对我很有帮助。谢谢。 - William Kinaan

12

你确定你实际上覆盖了doPost方法吗?

方法签名应该是这样的:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
           throws ServletException, java.io.IOException

但你可以像这样指定它:

public void doPost(HttpServletRequest request, HttpServletResponse response) 
           throws ServletException, IOException, IllegalStateException

我不确定这是否允许:

覆盖Java接口并添加新的已检查异常

尝试以下步骤:

  1. 添加 @Override 注释。
  2. 移除 throws IllegalStateException(不应该是问题,因为它是运行时异常)。

当我删除异常或添加 @Override 时,它都能正常工作。谢谢。 - jcubic
细节简单而又非常强大。我也犯了同样的错误。谢谢! - Marcelo Rebouças

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接