URIEncoding和useBodyEncodingForURI详解

之前关于编码的问题已经总结过两次了,有些地方写的很粗略。
http://blog.itpub.net/29254281/viewspace-775925/
http://blog.itpub.net/29254281/viewspace-1063133/

Tomcat解决请求乱码可以使用URIEncoding和useBodyEncodingForURI.下面是两个参数的具体说明,参见ApacheTomcat官方手册。

URIEncoding This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
useBodyEncodingForURI This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html


在上图可以看到,中文乱码容易出现在两个地方。一个是所请求的资源名称为中文,一个是查询参数的内容包括中文。
更复杂的是,不同的浏览器可能使用两种编码分别处理URL和查询参数。
useBodyEncodingForURI只是针对图上"author=君山"的查询参数(QueryString)有效,他的设置对于URL和URI无效。
下面以Windows环境为例,分别测试谷歌、火狐和IE浏览器请求中文资源和中文参数的乱码情况。

下表是三种浏览器的编码情况。其中IE的URI编码可以调整为UTF8。

  默认URI编码 默认查询参数编码
谷歌 UTF8 UTF8
火狐 UTF8 GBK
IE GBK GBK


1.Tomcat的URIEncoding设置为UTF8
谷歌正常
火狐可以请求到资源,但是查询参数的中文为乱码
IE不能请求到资源

测试代码如下

测试结果如下:

2.将IE的URI编码设置为UTF8,开启useBodyEncodingForURI,并设置request的字符集为GBK。

针对URI和查询参数使用两种编码的情况,可以使用useBodyEncodingForURI。他会根据http body设置的字符集解码。
将IE设置为"发送UTF8的URL"之后,三种浏览器都使用UTF8作为URI编码,但是IE和火狐的查询参数使用GBK编码,而谷歌的查询参数使用UTF8编码。所以在这种情况下,IE和火狐的访问都是正常的,而使用谷歌浏览器,可以访问资源,但是中文的查询参数则是乱码。

测试结果:

实验得出的结论是
1.URIEncoding和useBodyEncodingForURI都可以处理中文乱码的问题
2.浏览器对于URI和查询参数可能使用两种不同的编码方式,这种情况下,可以使用useBodyEncodingForURI调整查询参数的编码。

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

时间: 2024-08-08 06:00:04

URIEncoding和useBodyEncodingForURI详解的相关文章

server.xml文件详解

一.server.xml文件介绍 1.server.xml作用 Server.xml配置文件用于对整个容器进行相关的配置. 2.server.xml文件的配置元素列表 <Server>:是整个配置文件的根元素.表示整个Catalina容器. <Connector>:连接器,负责接收客户的请求,以及向客户端回送响应的消息. <Engine>:为特定的Service处理所有的请示.每个Service只能包含一个Engine元素,它负责接收和处理此Service所有的连接器收

Tomcat配置文件详解

/export/servers/tomcat7/conf/server.xml 里面很多都是注释: 我们先来看看各个组件之间的关系: server.xml文件中可定义的元素非常多,知道以上的就足够了! 下面来说说常用组件: 1. Server组件: 文本式例: <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.

Java性能分析之线程栈详解(下)

Java性能分析之线程栈详解(下) 转载自:微信公众号"测试那点事儿" 结合jstack结果对线程状态详解 上篇文章详细介绍了线程栈的作用.状态.任何查看理解,本篇文章结合jstack工具来查看线程状态,并列出重点关注目标.Jstack是常用的排查工具,它能输出在某一个时间,Java进程中所有线程的状态,很多时候这些状态信息能给我们的排查工作带来有用的线索. Jstack的输出中,Java线程状态主要是以下几种: 1.BLOCKED 线程在等待monitor锁(synchronized

Tomcat 下4个配置文件详解

Tomcat 的配置文件由4个 xml 文件构成,context.xml.web.xml.server.xml.tomcat-users.xml 这4个文件.每个文件都有自己的功能与配置方法,下列将逐一介绍这几个文件的配置: 一.context.xml 文件 Context.xml 是 Tomcat 公用的环境配置,tomcat 服务器会定时去扫描这个文件.一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器.推荐在 $CATALINA_BASEconf/contex

Tomcat记录-tomcat常用配置详解和优化方法

常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是server.xml. /logs:存放日志文件. /server/webapps:来管理Tomcat-web服务用的.仅对TOMCAT可见,对所有的WEB APP都不可见(使用Catalina类加载器加载). /shared/lib:仅对所有WEB APP可见,对TOMCAT不可见(使用Shared类加载

tomcat常用配置详解 及优化

常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是server.xml. /logs:存放日志文件. /server/webapps:来管理Tomcat-web服务用的.仅对TOMCAT可见,对所有的WEB APP都不可见(使用Catalina类加载器加载). /shared/lib:仅对所有WEB APP可见,对TOMCAT不可见(使用Shared类加载

Servlet详解

1.   Servlet简介 l  Servlet是服务器端的重要组件,直译为服务端的小程序,它属于动态资源,用来处理请求,服务器接收到请求后会调用Servlet来处理请求. l  Servlet的主要作用 n  接收请求 n  处理请求 n  完成响应 l  例如: 当我们要完成一个登录功能时,用户会将输入的用户名和密码以POST请求的形式发送到服务器,但是服务器本身并不具有能力来读取用户发送的用户名和密码,也就不可能对用户名和密码进行验证,所以当服务器收到这类请求后需要将请求转个一个Serv

[web] Get和Post区别,EncType提交数据的格式详解

转载自:http://www.cnblogs.com/sunxucool/archive/2012/12/11/2813113.html 1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程. 3. 对于get方

response和request详解

JavaEE:response响应和request请求 Web服务器接收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象既然代表请求和响应,那么我们要获取客户机提交过来的数据,只需要找request对象,就行了.要向客户机输出数据,只需要找response对象就行了. HttpServletRequest封装客户端相关信息,服务器Servlet程序可以通过request对象操作客户端信