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/
URIEncoding和useBodyEncodingForURI详解的更多相关文章
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
- Tomcat 优化方案 和 配置详解(转)
转自 Tomcat 优化方案 和 配置详解 http://201605130349.iteye.com/blog/2298985 Server.xml配置文件用于对整个容器进行相关的配置. <S ...
- Tomcat 下4个配置文件详解
Tomcat 的配置文件由4个 xml 文件构成,context.xml.web.xml.server.xml.tomcat-users.xml 这4个文件.每个文件都有自己的功能与配置方法,下列将逐 ...
- Tomcat记录-tomcat常用配置详解和优化方法(转载)
常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- server.xml文件详解
一.server.xml文件介绍 1.server.xml作用 Server.xml配置文件用于对整个容器进行相关的配置. 2.server.xml文件的配置元素列表 <Server&g ...
- tomcat常用配置详解和优化方法
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...
- Tomcat负载均衡、调优核心应用进阶学习笔记(一):tomcat文件目录、页面、架构组件详解、tomcat运行方式、组件介绍、tomcat管理
文章目录 tomcat文件目录 bin conf lib logs temp webapps work 页面 架构组件详解 tomcat运行方式 组件介绍 tomcat管理 tomcat文件目录 ➜ ...
- Tomcat中的Server.xml配置详解
Tomcat中的Server.xml配置详解 Tomcat Server的结构图如下: 该文件描述了如何启动Tomcat Server <Server> <Listener /> ...
随机推荐
- Java对象的序列化和反序列化实践
2013-12-20 14:58 对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象.对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存 ...
- 新浪微博数据抓取(java实现)
多了不说,直接贴出相关部分的实现代码 加密部分实现: package token.exe; import java.math.BigInteger; import java.util.Random; ...
- https需要的类
import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import j ...
- Memcache 详解
这里收集了经常被问到的关于memcached的问题 一般的问题 什么是memcached? 从哪获得memcached? 怎么安装memcached? 哪些平台可以运行memcached? 什么情况下 ...
- [流媒体]live555简介(转)
live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现 了对多种音视频编码 ...
- 修改Azure Website 移动服务 默认时区
Azure Website 默认时区为国际标准时间,对中国用户来说不太方便友好,如何设置成北京时间呢? 打开Azure Website的“配置”页,找到“应用设置”节点. 在应用设置中添加设置项,密钥 ...
- C# Inject
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Di ...
- 乌龟棋(noip2010)
分析:该题是经典的动态规划题目. 题目中涉及到卡片数.卡片分4类.格子数等若干信息,又每张卡片仅能使用一次.求到达终点最多能能获得多少分. 从题目中可知卡片的使用顺序影响最终得分,我们可知状态转移和使 ...
- 对比学习UIKit和AppKit--入门级
UIKit是用来开发iOS的应用的,AppKit是用来开发Mac应用的,在使用过程中他们很相似,可是又有很多不同之处,通过对比分析它们的几个核心对象,可以避免混淆. UIKit和AppKit都有一个A ...
- 字符串常量演示Demo
public class StringDemo { public static void main(String[] args) { // TODO Auto-generated method stu ...