J2EE以GET和POST方式提交表单的乱码解决(受教了)
背景:今天做IMIX共享平台提交表单时,以GET方式提交表单会在提交数据库之前就出现乱码(form是我自己写的,若是用struts的标签的话就不会有问题,因为struts提供的表单默认提交方式是POST),而改成POST方式就不会出现这个问题,Spring的CharaterEncodingFilter配过了,后来在网上查才知道GET和POST编码解决方法不一样。附件中有详细的乱码解决方案。
?
这里有个哥们跟我遇到了类似的问题:
组合查询功能,原先使用<html:form>缺省是以POST方式提交的,增加了分页功能后,由于要在URL里记住用户提交的查询内容(例如:http://localhost:8080/aims/client/filter.do?name=%E5%BC%A0&address=%E5%8C%97%E4%BA%AC&title=&duty=&departmentCode=10000001&categoryCode=10000002&fieldCode=10000006&genderCode=&identityCode=),所以表单的提交方式要改为GET。
只是简单的改为method="GET",但这样一改却让action无法得到正确的输入值,例如用户在姓名条件里输入“张”,在action里用theForm.getName()会得到形如“%A4”的乱码,不仅查询结果是错误的,而且在重新显示的查询表单的姓名栏里也显示出乱码。
我试了很多种转码也没转成原来的值,问了很多朋友,最后的解决方式还是通过转换编码,是把ISO8859-1转为UTF-8,即String name=new String(theForm.getName().getBytes("ISO8859-1"),"UTF-8");,注意我的应用程序里已使用了encoding为UTF-8的Filter。
虽然要加手工转码的代码很不爽,但只在这一处而已,也不碍大事。只是我现在的环境是Tomcat+Mysql,不知道换到其他服务器上会不会重新出现乱码问题,好在这个项目不需要考虑这个问题。
据说Tomcat处理POST和GET的请求时处理编码的方式不太一样,我还看到有篇帖子说要在server.xml的<Connector>里加URIEncoding="GBK"属性,但我试了不起丝毫作用。
?
?????? <c:param name="name" value="中文乱码s"></c:param>5,jsp表单提交到action默认为post提交;POST提交不须再处理乱码因为struts已经在过滤器里面帮你把乱码处理了
6,ajax POST和GET提交乱码处理
在AJAX提交中要把参数和URL分离开来处理
var xmlHttp;
//自动加载国家
function country() {
??? var text = "sql=SELECT co_name FROM COUNTRY order by nvl(length(trim(co_name)),0) asc,co_name";
??? var url = "ajax/ajax!selectName.action";
??? createXmlhttp();
??? if (xmlHttp) {
??? ??? xmlHttp.open("POST", url, true);
??? ??? xmlHttp.setRequestHeader("Cache-Control", "no-cache");
??? ??? xmlHttp.setRequestHeader("Content-Type",
??? ??? ??? ??? "application/x-www-form-urlencoded");
??? ??? xmlHttp.onreadystatechange = function() {
??? ??? ??? if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
??? ??? ??? ??? parseMessage('country');
??? ??? ??? }
??? ??? }
??? ??? xmlHttp.send(text);
??? }
}
其中 xmlHttp.setRequestHeader("Cache-Control", "no-cache");
??? ??? xmlHttp.setRequestHeader("Content-Type",
??? ??? ??? ??? "application/x-www-form-urlencoded");这个要加上
action中:HttpServletResponse response= ServletActionContext.getResponse();
??? ??? response.setContentType("html/xml;charset=gb2312");
??? ??? response.setCharacterEncoding("UTF-8");