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
相关产品推荐
相关产品推荐

