今天写的一个下载功能发现了一个问题:
这个下载的功能是将前台获取的数据传递到后台之后下载成excel文件,我就写了一个方法:
window.location.href = $("#basePath").val() + "purPlan/exportDetail.do?details="+ encodeURI(JSON.stringify(details));
其中details就是要传递的数据,我把它编码之后传到后台进行处理。
本来数据量不大的时候是没有问题的,然后写了几百条数据进去了之后下载就出现问题了。点击下载一直未响应。
百度之后发现:通过url传递数据使用的是get方式,是有大小限制的。很多文章都说GET方式提交的数据最多只能是1024字节。
而实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35字节)。对于其他浏览器,如FireFox,Netscape等,则没有长度限制,这个时候其限制取决于服务器的操作系统。即如果url太长,服务器可能会因为安全方面的设置从而拒绝请求或者发生不完整的数据请求。
而使用post传递数据理论上是没有限制的。
所以,在url中传递数据,如果传递的数据过多,就可能会发生错误。
因此直接在下载的url中传递大量数据是不可行的。
所以我做了如下修改:
//前台
$.ajax({
url : "purPlan/postDetailsData.do",
type : "post",
dataType : "json",
data : {
details : JSON.stringify(details)
},
success : function(data){
if(data && data.success){
window.location.href = $("#basePath").val() + "purPlan/exportDetail.do";
}else{
$.dialog.alert("出现问题!");
}
}
});
//后台
@RequestMapping("/postDetailsData.do")
public void postDetailsData(HttpServletRequest request,HttpServletResponse response,HttpSession session,String details){
session.setAttribute("details", details);
this.writeJson(response, new AjaxMsg(true,"传递数据成功"));
}
@RequestMapping(value = "/exportDetail.do")
public void exportDetail(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws Exception{
String details = (String) session.getAttribute("details");
//将明细字符串转化为fmodel
List<FPurPlanDetail> detailList = JsonParse.getList(details , FPurPlanDetail.class);
ExportHelp.compatibleFileName(request, response, "物资导出");
PurPlanExport.exportExcel(response,detailList);
}
先使用ajax的post方式将数据传送到后台,将数据保存到session中,在访问下载数据的url,从session中获取数据然后进行处理、下载。这样可以避免出现问题。