get方式编码问题解决方案 转载

时间:2023-03-08 22:40:13
我们的内容使用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"); 进行解码,这样就得到了“测试”