You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jQuery发起PUT/DELETE请求时遭遇405方法不允许错误的求助

解决jQuery发起PUT/DELETE请求到Tomcat静态文件出现405错误的问题

嘿,我来帮你捋清楚这个问题~你遇到的405 Method Not Allowed错误,核心原因是Tomcat默认对静态资源(比如你的test.html)只允许GET、POST、HEAD、OPTIONS这些请求方法,PUT和DELETE这类方法是被拒绝的——因为静态文件本身不需要被修改或删除,Tomcat的默认Servlet(DefaultServlet)没有处理这些方法的逻辑。你跟着的教程大概率是基于有后端REST接口的场景,而非直接请求静态文件。

为什么会出现这个问题?

Tomcat的DefaultServlet负责处理静态资源请求,它的默认配置里只放行GET, HEAD, POST, OPTIONS这几种方法。当你发送PUT/DELETE请求到静态HTML文件时,Tomcat直接返回405,明确告诉你这个方法不被允许。

可行的解决方案

1. 编写后端接口处理PUT/DELETE请求

如果你的需求是真的要处理PUT/DELETE操作(比如修改或删除资源),你需要在Tomcat里部署一个后端接口(比如Servlet、Spring MVC控制器)来接收这些请求,而不是直接请求静态HTML文件。

举个简单的Servlet例子:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/test-api")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain");
        PrintWriter out = resp.getWriter();
        out.println("PUT请求处理成功");
        resp.setStatus(HttpServletResponse.SC_OK);
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain");
        PrintWriter out = resp.getWriter();
        out.println("DELETE请求处理成功");
        resp.setStatus(HttpServletResponse.SC_OK);
    }
}

然后修改你的jQuery代码里的url为这个Servlet的路径:

function makePUTrequest() {
$.ajax({
url: 'test-api',
type: 'PUT',
success: function (result) {
alert("PUT请求结果:" + result);
}
});
}
function makeDELETErequest() {
$.ajax({
url: 'test-api',
type: 'DELETE',
success: function (result) {
alert("DELETE请求结果:" + result);
}
});
}

部署后点击按钮,就能正常处理PUT/DELETE请求了。

2. 只是测试jQuery的PUT/DELETE语法?

如果你只是想验证自己的jQuery代码是否正确,不需要实际修改资源,可以用以下方式:

  • 临时搭一个简单的后端服务(比如用Node.js的Express),写一个支持PUT/DELETE的接口来测试;
  • 或者,在Tomcat里修改web.xml配置,让DefaultServlet允许PUT/DELETE方法(但不推荐,因为静态文件不需要这些操作,会带来安全风险)。修改示例:
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <!-- 保留其他默认参数 -->
    <load-on-startup>1</load-on-startup>
</servlet>

注意:开启readonly=false后,Tomcat允许对静态文件进行PUT/DELETE操作,可能会导致文件被意外修改或删除,仅适合本地测试使用。

总结

你的jQuery代码本身是没问题的,问题出在请求的目标是静态HTML文件,而Tomcat不允许对静态资源使用PUT/DELETE方法。最合理的解决方式是编写后端接口来处理这些请求,既符合Web开发规范,也更安全。

内容的提问来源于stack exchange,提问作者ViS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:39:06