场景描述
word导出功能做完后,客户点击导出,先弹出确认取消框,确认时,如果一个人导出一个word,多个人则导出zip,客户前面用得挺好的;后面随着客户人员的增加,,一个部门下超50人后,客户某天点击导出,页面直接空白了;
一看F12,请求的url参数超长度了;网上给基本都是隐藏表单,提交表单来发送请求的方式,但是这种方式太复杂了,我不想使用;
最后在偶然间看见一篇大佬写的新思路,我觉得简单易学,就借鉴了过来;整体思路是2步走,①先用ajax发送参数到后台,后台将参数用Session存放起来,②在ajax的success回调中使用window.location.href=下载请求,这个下载请求的参数从Session中取;
场景代码
前段请求
原请求
//这种方式,批量导出,参数过多时,会出现url参数超出长度问题
//发送请求并返回浏览器下载
var ids = [];
var wordNames = [];
$.layerConfirm("请确定要导出人员登记表", function (res, index) {
if (res) {
$.layer.close(index);
window.location.href=$.rootUrl + '/sys/toWord/exportEmp?ids='+ids+'&wordNames='+wordNames;
}
});
修改后的请求
//修改后的逻辑,批量导出人员信息就不会出现url参数超出长度问题
var ids = [];
var wordNames = [];
$.layerConfirm("请确定要导出人员登记表", function (res, index) {
if (res) {
$.layer.close(index);
$.ajax({
url:$.rootUrl + '/sys/toWord/exportEmpSession', //发送参数请求到后台,后台存放到Session
type:'post',
data: {"ids":ids,"wordNames":wordNames},
traditional: true,
dataType:'json',
async:false,
success:function(res){
if(res.code='200'){
window.location.href=$.rootUrl + '/sys/toWord/exportEmp'; // 从后台Session取参数
}
}
});
}
});
后端代码
/**
* 存放导出人员word文档的参数
* @param request
* @param ids 人员ID数组
* @param wordNames 文档名称数组
* @return
*/
@ResponseBody
@RequestMapping("/exportEmpSession")
public ResultUtils exportEmpSession(HttpServletRequest request, String[] ids, String[] wordNames){
HttpSession session= request.getSession();
//先清后存
session.removeAttribute("exportEmpSessionIds");
session.removeAttribute("exportEmpSessionWordNames");
session.setAttribute("exportEmpSessionIds",ids);
session.setAttribute("exportEmpSessionWordNames",wordNames);
return ResultUtils.success();
}
/**
* 导出人员word文档
* ids人员id 和 wordNames导出的word名称,从session中获取
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/exportEmp")
public void exportEmp(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session= request.getSession();
//先用后清
String[] ids = (String[]) session.getAttribute("exportEmpSessionIds");
String[] wordNames = (String[]) session.getAttribute("exportEmpSessionWordNames");
session.removeAttribute("exportEmpSessionIds");
session.removeAttribute("exportEmpSessionWordNames");
//原本逻辑的导出word方法,保持不变即可
}