Servlet中web请求的编码

Servlet中Web请求的编码是一个很伤脑筋的问题。使用多个Servlet容器的人一定知道,每个容器的缺省编码不一定一样。比如说,Jetty和Tomcat就不一样。很多人都喜欢在Jetty上进行开发,最终产品在Tomcat上运行。这个编码的差别很有可能在最后测试的时候给你一个不大不小的惊奇 - 一个伤脑筋的惊奇。

当用户从浏览器发送请求的时候,浏览器根据页面的编码,对参数进行编码。然后,把编码后的字节用ISO-8859-1进行编码然后传送给服务器。以UTF-8作为例子,在表单里的字符串“中国”,传送到服务器的过程是:

浏览器
“中国” => UTF-8 Encoding(“中国”)=> ISO-8859-1 Encoding(UTF-8 Encoding(“中国”))

服务器
ISO-8859-1 Encoding(UTF-8 Encoding(“中国”)) => UTF-8 Encoding(“中国”) => “中国”

问题是,服务器需要知道原始的编码,才能得到正确的字符串。你可能以为请求里面应该有足够的信息让服务器能够正确解码。但现实状况是,没有。

首先说一下请求的类型。GET和POST都可以用来传送参数。差别是,在GET中参数是URI上传送的;在POST中参数是在消息体(BODY)中传送的。同样,这两种方法的编码处理也是不一样的。在Tomcat 5.5中,两种方法的缺省编码都是ISO8859-1,也就是说,如果是UTF-8页面发送过来的请求,要是没有特别的指示的话,Tomcat会把它当作ISO-8859-1的字节,那得到的就是乱码了。

GET的编码可以在Tomcat的server.xml设置。下面把缺省的编码设置成UTF-8

<Server ...>
<Service ...>
<Connector ... URIEncoding="UTF-8"/>
...
</Connector>
</Service>
</Server>
POST的编码则是由请求里的setCharacterEncoding来设置。如果你使用getParameter来读取参数值,必须确保在没有任何getParameter调用之前就设置好编码了。一个方便的地方是Servlet 2.3的Filter。下面代码用了Spring提供的CharacterEncodingFilter来设置缺省为UTF-8。注意要尽量把这个Filter放到Filter链的最前面。虽然使用了Spring,但在常规的Servlet架构中定义一个Filter是同样的简单。

<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

最后一种情形,要是你不能更改Tomcat的server.xml怎么办?我的做法是,缺省使用ISO8859-1,读取参数值的时候,使用工具类而不是直接使用ServletRequest的getParameter。示范的转换代码如下:

byte[] stringBytesISO = isoString.getBytes("ISO-8859-1");
utf8String = new String(stringBytesISO, "UTF-8");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值