如何在jQuery DataTable中通过HTTP请求传参至Spring Boot控制器
没问题,咱们把请求改成POST方式,把参数放到HTTP请求体里,这样就不会暴露在URL中啦。下面分前端和后端两部分来修改:
1. 前端jQuery DataTable代码修改
把原来的GET请求改成POST,同时将参数封装到JSON请求体中,还要适配DataTable的分页/排序参数(如果需要的话):
$("button#search").click(function() { var name = $("#name").val(); var age = $("#age").val(); $('#customerTable').DataTable({ "type": "POST", // 切换为POST请求 "ajax": { "url": "/searchCustomer/search", "contentType": "application/json", // 告诉服务器请求体是JSON格式 "data": function(d) { // 封装自定义查询参数 + DataTable自带的分页/排序参数 return JSON.stringify({ name: name, age: age, start: d.start, // 分页起始位置 length: d.length, // 每页条数 searchValue: d.search.value // 全局搜索关键词 }); }, "dataSrc": "data" // 指定从返回JSON的data字段取表格数据 }, "cache": false, "bDestroy":true, "aLengthMenu": [20, 50, 70, 100], "columns":[ {"data": "customerid" }, {"data": "name"}, {"data": "mobilenumber"}, {"data": "status"}, ], "language": { "lengthMenu": "| View _MENU_ records per page", "zeroRecords": "No matching records found", "infoEmpty": "No records available", "infoFiltered": "(filtered from _MAX_ total records)" }, "pagingType": "full_numbers", }); });
2. 后端Spring Boot控制器修改
首先创建一个DTO类来接收请求体中的JSON参数(比零散接收更规范),然后修改控制器方法为POST类型,用@RequestBody绑定参数:
第一步:创建请求DTO类
public class CustomerSearchRequest { private String name; private String age; // 如果需要处理分页,保留以下字段;不需要的话可以删掉 private int start; private int length; private String searchValue; // 所有字段的getter和setter public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public int getStart() { return start; } public void setStart(int start) { this.start = start; } public int getLength() { return length; } public void setLength(int length) { this.length = length; } public String getSearchValue() { return searchValue; } public void setSearchValue(String searchValue) { this.searchValue = searchValue; } }
第二步:修改控制器方法
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; // 替换原来的GET请求为POST @PostMapping(value = "/searchCustomer/search") public @ResponseBody JSONObject getCustomers(@RequestBody CustomerSearchRequest request) { List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>(); JSONObject ajson = new JSONObject(); // 从request对象中获取参数 String queryName = request.getName(); String queryAge = request.getAge(); // 如果处理分页,还可以取request.getStart()、request.getLength()等 // 你的业务逻辑写在这里 // list1.add(yourDataMap); ajson.put("data", list1); return ajson; // 修复了原代码中return json的笔误 }
关键改动说明
前端:
- 切换请求方式为POST,符合HTTP规范(GET不建议携带请求体)
- 通过
contentType: "application/json"声明请求体格式,确保后端能正确解析 - 用
JSON.stringify()将参数转为JSON字符串,避免参数暴露在URL中 - 保留DataTable的分页参数,方便后端做分页查询(不需要的话可以简化)
后端:
- 用
@PostMapping替代原有的GET映射 - 用
@RequestBody绑定请求体中的JSON到DTO对象,比@RequestParam更安全、更易维护 - 修复了原代码中
return json的笔误(应该返回ajson)
- 用
内容的提问来源于stack exchange,提问作者Naresh
相关产品推荐
相关产品推荐

