带“+”号的参数值通过url传递,后台取不到正确值

问题是这样的:

--W9/baseTestPoint.jsp

旧源代码:

javascript:

var url = "<%=appUrl%>/quality/qualityStandard.do?method=getSelectedStandard_d&mtrl_no="+mtrl_no
                        +"&quality_type="+quality_type+"&standard_item="+stardard_item;
Tldown.func("Load",encodeURI(url));

quality_type的值为“类型”

standard_item的值为“a+28+b+28”。

java后台取:

String quality_type = base.utf8(request.getParameter("quality_type"));

String standard_item = base.utf8(request.getParameter("standard_item"));

standard_item得到“a 28 b 28”

后来我通过在javascript输出encodeURI(url),encodeURIComponent(url)的值:

url:url

encodeURI(url):encode

encodeURIComponent(url):encodeComponent

经过对照,决定只对带特殊值的参数做encodeURIComponent转换。同时,寻找后台解码的方法。最后,解决方案如下:

  • javascript修改如下:

var url = "<%=appUrl%>/quality/qualityStandard.do?method=getSelectedStandard_d&mtrl_no="+mtrl_no
                        +"&quality_type="+quality_type+"&standard_item="+encodeURIComponent(stardard_item);
Tldown.func("Load",encodeURI(url));

  • java:

String standard_item = java.net.URLDecoder.decode(request.getParameter("standard_item"),"UTF-8");
String quality_type = base.utf8(request.getParameter("quality_type"));

 

总结:

encodeURI对+号不编码,而encodeURIComponent会对“+”号做编码,但是,不能对整个url做encodeURIComponent,因为这样会连“//”,“/”都会被解析,就不再是一个正确的url。

另外,对encodeURIComponent后提交的数据,必须使用java.net.URLDecoder.decode解析。而被encodeURI后的数据,如汉字,可以直接通过转换编码类型获得正确内容。

posted @ 2009-12-18 13:32  wala  阅读(1797)  评论(0编辑  收藏  举报