第一种方法:
1.传参处编码(编一次码)
function open(){
var userName = document.getElementById("userName");
userName = encodeURI(userName);// 编一次码。注:encodeURI是JS函数
window.location.href="/test.do?userName=+userName;
}
String userName = request.getParameter("userName");
userName = new String(userName.getBytes("ISO8859_1"), "UTF-8");
===========================经验证可行===========================
第二种方法:
1.传参处编码(编两次码)
function open(){
var userName = document.getElementById("userName");
userName = encodeURI(encodeURI(userName));// 要编两次码。注:encodeURI是JS函数
window.location.href="/test.do?userName=+userName;
}
2.action中:参数解码
String userName = request.getParameter("userName");
userName = java.net.URLDecoder.decode(userName ,"utf-8");// 解一次码
===========================经验证可行===========================
编码与解码的次数解释(网上摘录):
一种说法:使用encodeURI转码后,会出现特殊字符,这时候,就需要将特殊字符也转码,所以使用两次encodeURI。在传参是浏览器会对参数进行一次解码,所以在Action中只需解码一次就可以了。
另一种说法:客户端对参数进行二次编码,可以有效的避开“提交多字节字符”的这个棘手问题。因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不带有多字节字符的)再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR_ENC1])然后,再在程序中实现一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的参数的原值。