Tomcat部署Servlet访问报HTTP 405 Method Not Allowed错误
问题根因
- 浏览器地址栏直接输入URL发起的是HTTP GET请求,但你的
ResponseServlet仅实现了doPost方法,没有编写处理GET请求的对应逻辑。 HttpServlet父类自带的默认doGet/doPost方法实现,会在收到未重写对应处理方法的请求时,直接返回HTTP 405 Method Not Allowed状态码,和你看到的报错完全吻合。
修复方案
根据你的接口设计需求二选一即可:
方案1:接口需要支持GET访问
在Servlet类中新增doGet方法,直接复用已有的doPost逻辑即可,修改后的完整代码如下:
import java.io.*; import jakarta.servlet.*; import jakarta.servlet.http.*; import java.util.Random; public class ResponseServlet extends HttpServlet{ // 新增doGet方法处理GET请求 @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response){ try{ String name = request.getParameter("name"); PrintWriter out = response.getWriter(); if(name == null){ out.println("No name has been given."); return; } out.println(getGreeting() + name); } catch(IOException e){ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } String getGreeting(){ switch((new Random()).nextInt(5)){ case 0: return "Hello, "; case 1: return "Nice to meet you, "; case 2: return "Hi, "; case 3: return "Yo, "; case 4: return "Hey, "; } return "Hello, "; } }
修改后重新编译Java文件,将新生成的ResponseServlet.class替换到ajaxgreetings/WEB-INF/classes目录,重启Tomcat即可正常通过浏览器地址栏访问。
方案2:接口仅允许POST请求
该场景下405报错属于符合预期的行为,不要通过浏览器地址栏直接访问该路径,改用POST方式发起请求即可,常见调用方式包括:
- 编写method属性为
post的HTML表单提交 - 使用接口调试工具选择POST方法调用
- 前端通过AJAX指定请求方法为POST发起调用
简单的表单示例:
<form action="/ajaxgreetings/response" method="post"> 姓名:<input type="text" name="name"> <button type="submit">提交</button> </form>
补充提示:当前Servlet类放在默认包下,仅适合简单测试场景,正式开发建议给类添加明确的包声明,同时将web.xml中
servlet-class配置改为类的全限定名(包名+类名),避免出现类加载失败的问题。
内容的提问来源于stack exchange,提问作者Robert Mdee
相关产品推荐
相关产品推荐

