GET方式提交中文编码问题以及三种解决方式
GET方式提交在WEB中是非常常用的方式,有时候我们在使用GET方式提交请求不得不提交中文,但是TOMCAT等容器对于GET方式的编码问题总是让人折腾。
先说说流程吧:
我们的内容使用GET方式发送,就会在URL后面带上内容,在游览器发来的请求经过了游览器的URI编码,发送到服务器这边,如果是struts2会经过拦截器进行URI解码,并且使用"iso8859-1"进行编码,因为传输过程是二进制的。
这时候想解决中文编码问题有三种方式
假设:
url:http://localhost:8080/test?name=测试
一、在服务器进行处理
得到的内容是"iso8859-1",使用
String str = new String(name.getByte("iso8859-1"),"utf-8");
得到正确的值。
ps:这种方式有个缺点;这种方式服务器必须默认使用iso8859-1的方式编码,如果我在TOMCAT更改默认的iso8859-1为utf-8,那么这种方式就无法生效了。
二、在TOMCAT配置文件中设置
在TOMCAT的目录下conf/server.xml中,搜索"8080"端口,如果改了端口按端口号搜索,搜到之后在这个标签中空格输入 URIEncoding="UTF-8" ,它默认是iso8859-1。
ps:这种方式缺点显而易见,换了服务器就要更改,有时候忘记也是很常见的事情。
三、手动编码多一次
游览器和服务器传输都是先编码后解码,对中文的支持不太好,那么能不能把中文事先转换成英文或数字传输呢?
假设:
1、name=测试,在JS标签中,使用encodeURI(param)方法先将“测试” 转成 name=%26%92(瞎编的) 游览器再自动进行URI编码 name=%2525%2592(%的URI编码为%25);
ognl表达式中,使用<s:param name="name" value="%{@java.net.URLEncoder.encode(name,'utf-8')}"> 对值进行URI编码,同时在struts2配置文件中开启静态方法的支持 java.net.URLEncoder.encode()。
struts.xml: name="struts.ognl.allowStaticMehtodAccess" value="true"
2、这时候将这链接GET方式提交了
3、服务器那边得到 name=%26%92 ,我们再使用URIDecoder.decode(name,"utf-8"); 进行解码,这样就得到了“测试”
PS:这种方式是不是比较好,不依赖TOMCAT