Web中文乱码——1、SpringMVC+Jetty编解码基础

来源:互联网 发布:淘宝客api 生成链接 编辑:程序博客网 时间:2024/06/08 05:53

        我们部门的web项目常用的是spring+jetty。在编解码过程中,spring本身不会进行干预,而jetty也干预减少。因此,我们从浏览器和Servlet之间的交互入手,来看Spring+jetty项目的编解码过程。

        浏览器和Servlet之间的交互过程如下图所示,主要分成4个部分。


一、浏览器发送请求

        浏览器发送的请求参数会进行URL encode。URL encode区别于encode的主要特点是:前者对中文编码后会带百分号。详细的请各位google吧。

1、表单递交

        表单递交时,浏览器采用的编码由header中的Content-type决定,例如在快门中是:

<metacharset="Content-type: application/x-www-form-urlencoded;charset=UTF-8" />
        当没有指定Content-type时,浏览器默认采用ISO-8859-1进行URL encode。

2、Javascript

        IE总是采用操作系统的默认编码来进行编码,而Firefox/chrome总是采用utf-8编码。

二、Servlet接收请求

        Servlet收到请求时,会对其中的参数进行URL decode。Serlvet的行为是受应用服务器影响的,在使用Jetty时如下。

1、Get请求

        由Jetty决定,可以设置JVM参数org.eclipse.jetty.util.URI.charset,默认是UTF-8。

2、Post请求

        和Jetty无关。在获取参数值之前,通过HttpServletRequest.setCharacterEncoding(charset)来设置字符集,但必须在第一次调用request.getParameter()前设置。若没设置,则默认ISO-8859-1。

三、Servlet发送响应

        Servlet发送的响应时,响应内容自然是java自己定制的,可以是任意字符集。但无论如何,它需要把自己的编码方式告诉浏览器,以便对方正确解析。

3.1、html

        那么,对于html页面响应,只需要设置页面header中的Content-type,默认为ISO-8859-1。
<metacharset="Content-type: application/x-www-form-urlencoded;charset=UTF-8" />

3.2、VM

        velociy页面最终也相当于是一个html页面。因此首先也需要设置正确的Content-type,方法和上面一致。

        除此之外,还需要注意velocity本身的编码设置。

<bean id="velocityConfig"class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"><property name="resourceLoaderPath"><value>WEB-INF/view</value></property><property name="velocityProperties"><props><prop key="input.encoding">utf-8</prop><prop key="output.encoding">utf-8</prop><!--<prop key="eventhandler.referenceinsertion.class">org.apache.velocity.app.event.implement.EscapeHtmlReference</prop>--></props></property></bean>

        如上所示,input.encoding用于指定Java读取vm时采用的字符集;而output.encoding用于指定Java将vm输出到浏览器时采用的字符集。

3.3、Java write

        如果直接用HttpServletResponse.getWriter.write(),那就需要采用如下方式来设值

HttpServletResponse.setContentType(“text/html; charset=GBK”)
        在Servlet2.4以后,还可以采用如下方式
HttpServletResponse.setCharacterEncoding(charset)

四、浏览器接收响应

        浏览器收到响应时,会根据header中的Content-type来decode,默认为ISO-8859-1

五、推荐配置

        当然是推荐在上述可配置的地方全部配置成相同的编码,比如:UTF-8。

        但即使如此,乱码还是有可能发生。发生乱码的各种情形请参考下一篇《Web中文乱码——2、SpringMVC+Jetty 乱码

参考:
        http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
        http://blog.csdn.net/chenyongsuda/article/details/5393458

        http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

        http://shishi11.iteye.com/blog/869290

0 0
原创粉丝点击