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

AJAX发送DELETE请求到Servlet时request.getParameter取参数为null如何解决

问题根因

Servlet 规范默认仅会解析 GET、POST 请求的请求体中application/x-www-form-urlencoded格式的参数,注入到request.getParameter()的参数集合中。DELETE、PUT 等请求的请求体参数默认不会被解析,因此直接调用getParameter()会返回 null。


通用解决方案

方案1:前端适配(改动最小,优先推荐)

把参数拼接在请求URL的查询字符串中,不需要修改后端原有业务代码:

$("#btnDel").on("click",function(){
    var idsarray = [];
    $("input:checkbox[name=delbox]:checked").each(function() {
        idsarray.push($(this).val());
    });
    var idsString = idsarray.join();

    $.ajax({
        // 把参数拼接至URL查询串,特殊字符自动编码
        url: 'StudentController?idsToBeDeleted=' + encodeURIComponent(idsString),
        dataType: 'json',
        type: 'DELETE',
        success: function() {
            // 异步请求需要跳转请在前端实现,不要用后端重定向
            window.location.replace(window.location.contextPath);
        }
    });
});

后端原有request.getParameter("idsToBeDeleted")可直接正常读取参数。


方案2:后端适配(支持请求体传参)

如果业务要求必须把参数放在 DELETE 请求的请求体中,可手动解析请求体内容:

前端补充配置

$.ajax({
    url: 'StudentController',
    dataType: 'json',
    // 明确指定表单格式内容类型
    contentType: 'application/x-www-form-urlencoded;charset=utf-8',
    data: {"idsToBeDeleted" : idsString},
    type: 'DELETE'
});

后端解析代码

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 读取请求体内容
    StringBuilder sb = new StringBuilder();
    String line;
    try (BufferedReader reader = request.getReader()) {
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
    }
    String requestBody = sb.toString();
    Map<String, String> paramMap = new HashMap<>();

    // 解析表单格式参数
    if (requestBody.length() > 0) {
        String[] params = requestBody.split("&");
        for (String param : params) {
            String[] keyValue = param.split("=", 2);
            if (keyValue.length == 2) {
                String key = URLDecoder.decode(keyValue[0], StandardCharsets.UTF_8.name());
                String value = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8.name());
                paramMap.put(key, value);
            }
        }
    }

    String idlistString = paramMap.get("idsToBeDeleted");
    System.out.println(idlistString);

    // 返回JSON状态给前端
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write("{\"code\":200,\"msg\":\"删除成功\"}");
}

方案3:容器配置适配(Tomcat 环境可用)

如果使用 Tomcat 作为 Servlet 容器,可直接修改配置开启 DELETE/PUT 请求的参数解析能力,无需修改业务代码:
修改 Tomcat 安装目录下conf/server.xml的 Connector 配置,增加parseBodyMethods属性:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           parseBodyMethods="POST,PUT,DELETE" />

配置完成后重启 Tomcat,即可直接在doDelete方法中通过request.getParameter("idsToBeDeleted")读取参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:39:03