request,response乱码问题分析及解决总结

 刚才回顾以前的项目时,突然发现了这个老朋友,刚入坑时,这个问题可是折磨了我许久,因为刚进公司时,负责一个GBK编码的老项目改造,出现了不少乱码问题,借此机会总结一下,若也能给新入坑的伙伴一丝帮助那就更好了~:)。

问题背景


  • request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码;
  • response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;

原因分析


 不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的。

  • request乱码:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符),然后封装到request对象中。如果客户端的编码与服务器端的解码不统一,就会导致通过request获取到的请求参数的值是乱码。
  • response乱码:服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。

推荐方式


 若准备建一个新项目,那么web应用所有文件推荐都一致采用UTF-8编码,通过配置编码过滤器(见方法一)以及设置应用服务器请求编码都为UTF-8(见方法二中解决get请求乱码部分), 可以有效避免出现乱码问题。

解决方法


方法一:配置编码过滤器

spring项目可以如下配置:
在web.xml中配置:org.springframework.web.filter.CharacterEncodingFilter

<filter> 
<filter-name>encodingFilter </filter-name> 
<filter-class> 
org.springframework.web.filter.CharacterEncodingFilter 
</filter-class> 
<init-param> 
<param-name>encoding </param-name> 
<param-value>UTF-8 </param-value> 
</init-param> 
<init-param> 
<param-name>forceEncoding </param-name> 
<param-value>true </param-value> 
</init-param> 
</filter> 

<filter-mapping> 
<filter-name>encodingFilter </filter-name> 
<url-pattern>*.do </url-pattern> 
</filter-mapping>

方法二:设置 request 和 response 的编码 ( 页面编码必须为 utf-8 )

解决post请求乱码:

Action中:

request.setCharacterEncoding("UTF-8");//设置传值编码,解决request乱码,即解决后台接收参数乱码
response.setContentType("text/html;charset=UTF-8");//设置传输编码,解决response乱码,即解决页面显示乱码

 该方法必须在response.getWriter()之前进行设置,等同于:

response.setHeader("contentType", "text/html; charset=utf-8”);

它其实会覆盖response.setCharacterEncoding("utf-8”)

解决get请求乱码:

 URL中的字符串的编码和解码是由浏览器和应用服务器的配置决定的,get方式提交的参数会跟在请求行中的uri后边,服务器按照默认的iso-8859-1进行解码,我们的程序不能设置,不要期望用request.setCharacterEncoding()方法能设置URL中参数值解码时的字符集,但我们可以通过修改服务器端对uri参数的默认编码来解决get请求(url传参)的乱码问题:

(1)对于Tomcat:
 在server.xml中,设置元素的属性URIEncoding="UTF-8”即可,作用是告诉服务器servlet解码URL时采用的编码。

<Connector port="8080" protocol="HTTP/1.1"
               maxThreads="150" connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

 其实还可以同时设置元素的属性useBodyEncodingForURI=“true”,意思是请求体和uri使用相同的编码格式。

<Connector port="8080" ... useBodyEncodingForURI="true" />

 通过设置这两个属性,既可以解决get方式的乱码,又可以解决 post方式的乱码。

注意:通过修改server.xml指定服务器对get和post统一按照utf-8解码,要求tomcat管理下的所有web应用都要使用utf-8编码,即所有的jsp、html页面都使用utf-8编码。

(2)对于 weblogic服务器
在weblogic.xml中设置:

<input-charset>
  <java-charset-name>GBK</java-charset-name>
</input-charset>

方法三:转码UTF-8(只适合解决少量棘手问题)

Action中:

String ss=new String(param.getBytes("ISO-8859-1"),"utf-8"); //转码为UTF-8,其中param是前台传来的字符串参数,

方法四:encodeURI()两次编码后台解码(只适合解决少量棘手问题)

1、在javascript中利用encodeURI()两次嵌套对URL中的中文参数进行编码
2、在后台获取到进过前端encodeURI()编码后的字符串,使用decode(String str,String ecn)方法进行解码

实例:
jsp中传参:

"param="+encodeURI(encodeURI(param))

Action接收参数:

param=java.net.URLDecoder.decode((String) getParameter("param"), "UTF-8");

参考文献

http://www.iteye.com/problems/42143
http://blog.csdn.net/yzhz

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值