Struts2(JSP)的URL请求中文乱码问题
2009-6-8 星期一 雨
今天下午刚好广陵同学去面广西IBM,我就在他笔记本上试着解决上次没有解决的URL中文请求乱码问题。直到刚才才解决。不奇怪,因为中国人特有的问题一般是在网上找不到答案的。一搜,遇到同样问题的还真不少,给出解决方法的还不少,但是很多都是重复,贴来贴去的,说的头头是道,照着做就是不行。已经是见惯不怪了。
比如说使用Spring自带的charEncodingFilter不行,自己写了一个Filter也不行。总之试了很多方法,重启了无数次Tomcat,还是不行。
比如这篇: struts2中文乱码解决方法,似乎很有道理,但是照做还是不行。
不过有个很搞笑的现象,就是使用它介绍的最无奈的方法:
public class ConvertCharacter{
public String Convert(String s){
String result;
byte[] temp ;
try{
temp = s.getBytes("iso-8859-1");
result = new String(temp,"utf-8");
}
return result;
}
}
发现在非IE内核的浏览器中是有效的,但是在IE内核的浏览器(比如Sogo),当传递的中文参数超过2个字就不行了。比如http://localhost:8080/JmsSyncSender/modifyUser?userId=某人就可以,但是http://localhost:8080/JmsSyncSender/modifyUser?userId=某某人,转换之后就是某某?乱码,也就是说从第三个字开始就是乱码了,太奇怪了,百思不得其解。
还是搜索一下英文吧,还真找的不错的文章。比如下面这篇:http://www.inter-locale.com/codeset1.jsp。不过它似乎跟上面那篇是一样的,只不过解释了为什么这么做的原因。
广陵回来后搜索到一篇文章,地址栏传值,中文乱码:
1.(方法一)
window.location=encodeURI(路径);
2.(方法二)tomcat做web服务器时,通过地址栏传中文参数时,为防止浏览器上的为乱码
需在服务器server.xml中配置对应的端口中配置编码方式即可.例如:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="UTF-
8"/>
中加入useBodyEncodingForURI="true" URIEncoding="UTF-8"就可以了.
使用第二种方法试了一下,将上面的转换类代码去掉,发现两者的效果是一样的。后者是有Tomcat帮我做了转换。这虽然方便了一些,但是还是没有解决IE内核浏览器的问题。
最后,我想是不是因为使用URL传值的问题呢?如果采用Form传值会怎样呢?于是试了一下,使用Hidden field,并使用
<a href="javascript: on_update_click('<s:property value=username />') >更新</a>
function on_update_click(username){
var txtUserId = document.getElementById("userId");
if(txtUserId!=null){
txtUserId.value= username;
}
document.listUserForm.action = "modifyUser";
document.listUserForm.submit();
}
这下都可以了,深感欣慰。