ie8兼容性问题(七) js参数值中文情况下无法传到controller

来源:互联网 发布:我的世界蛤蟆吃网络id 编辑:程序博客网 时间:2024/06/05 19:32

项目中遇到这样一个问题,要实现一个下载功能,参数有两个,一个id,一个标题。其中标题是中文。

js写法:
var params = {
  "id": "0001",
  "title": "需求响应速率概述"
}
window.open("downloadFilesController.do?download&id=" + params.id + "&title=" + params.title);

controller写法:
@controller
@requestMapping("/downloadFilesController")
public class downloadFilesController{
  @requestMapping(params = "download")
  public void download(
    HttpServeletRequest request,
    HttpServletResponse response,
    @RequestParam("id") String id,
    @RequestParam("title") String title
  ) {
    commonFileDownBizc.downloadFile(request, response, id, title);
   }
}

这段代码在chrome中是没有问题的。但是在ie8中就会报错。原因是这样的。ie8中是不能通过get方法传递中文参数到controller的。所以需要在js中给中文参数进行转码,转为Unicode号,然后到controller中进行解码,再传递给biz层。

js写法:
var params = {
  "id": "0001",
  "title": encodeURI(encodeURI("需求响应速率概述"))
}
window.open("downloadFilesController.do?download&id=" + params.id + "&title=" + params.title);

controller写法:
@controller
@requestMapping("/downloadFilesController")
public class downloadFilesController{
  @requestMapping(params = "download")
  public void download(
    HttpServeletRequest request,
    HttpServletResponse response,
    @RequestParam("id") String id,
    @RequestParam("title") String title
  ) {
    title = URLDecoder.decode(title, "utf-8");
    commonFileDownBizc.downloadFile(request, response, id, title);
   }
}

注意: 转码一定要两次转码。第一次将三字节的中文转为带%的单字节,第二次将%看做转义字符进行第二次转码。具体的网上有很多文献可以参考。

原创粉丝点击