环境:tomcat6.0.23 jdk 1.6

相关参考:

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

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

影响编码的环境:server.xml中Connector节点的URIEncoding与useBodyEncodingForURI参数,http请求头content-type charset=xxx中的charset值,servlet request的setCharacterEncoding参数值以及setCharacterEncoding的调用时机这五个环境参数;

请求参数解析的时间(tomcat环境):第一次请求request参数时,且每次用户请求中有且只有一次参数解析。换而言之,参数的初始化是Lazy的,且会一次性初始化所有请求中包含的参数字段与对应的取值;

get请求测试用例 A:

http://localhost:8080/test?addr=上海

请求头:content-type charset=utf-8;

server.xml配置<Connector URIEncoding="utf-8" useBodyEncodingForURI="true" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

服务端收到请求后的处理方式:servlet中未调用request.setCharacterEncoding("utf-8")

结果:getParameter("addr") 解码正确

get请求测试用例 B:

http://localhost:8080/test?addr=上海

请求头:(无 content-type charset=utf-8;)

server.xml配置<Connector URIEncoding="utf-8" useBodyEncodingForURI="true" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

服务端收到请求后的处理方式:同A

结果:getParameter("addr") 乱码

get请求测试用例 C:

http://localhost:8080/test?addr=上海

请求头:(无 content-type charset=utf-8;)/ content-type charset=iso-8859-1;

server.xml配置<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

服务端收到请求后的处理方式:同A

结果:getParameter("addr") 解码正确

参数解析过程(待整理):

-> server.xml
Connector -> setURIEncoding
CoyoteAdapter -> server(req: org.apache.coyote.Request, res: org.apache.coyote.Response) ->
req.getParameters():org.apache.tomcat.util.http.Parameters.setQueryStringEncoding(connector.getURIEncoding()) ->
connector.getContainer().getPipeline().getFirst().invoke(request, response) -> doFilter ->
#? org.apache.catalina.connector.Request.setCharacterEncoding() -> org.apache.coyote.Request.setCharacterEncoding()
getParameters ->
enc = org.apache.coyote.Request.getCharacterEncoding() -> org.apache.coyote.Request.charEncoding -if null-> get header content-type charset=???
-if enc != null-> org.apache.tomcat.util.http.Parameters.setEncoding(enc)
--if connector.getUseBodyEncodingForURI() -> org.apache.tomcat.util.http.Parameters.setQueryStringEncoding(enc)
-else org.apache.tomcat.util.http.Parameters.setEncoding("iso-8859-1")
--if connector.getUseBodyEncodingForURI() -> org.apache.tomcat.util.http.Parameters.setQueryStringEncoding("iso-8859-1")
GET decode -> org.apache.tomcat.util.http.Parameters.handleQueryParameters() -> queryStringEncoding decode queryString
POST decode -> org.apache.tomcat.util.http.Parameters.processParameters -> encoding decode data

Tomcat编码配置解疑的更多相关文章

  1. tomcat编码配置

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" ...

  2. 腾讯云服务器centos 6.5(jdk+tomcat+vsftp)、腾讯mysql数据库 及 tomcat自启动 配置教程

    1.腾讯云数据库配置 1.考虑到安全性问题,,平常不使用root用户登录,新增一个用户名neil,用来管理项目的数据库 a.首先登录root创建db_AA数据库 b.在root用户下,创建neil用户 ...

  3. Tomcat 安全配置与性能优化

    一.Tomcat内存优化 1.JAVA_OPTS参数说明 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OP ...

  4. JavaWeb学习之Servlet(一)----MyEclipse及Tomcat的配置

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4134921.html [开发环境] 物理机版本:Win 7旗舰版(64位 ...

  5. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  6. SSL 通信原理及Tomcat SSL 配置

    SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...

  7. Web —— java web 项目 Tomcat 的配置 与 第一个web 项目创建

    目录: 0.前言 1.Tomcat的配置 2.第一个Web 项目 0.前言 刚刚开始接触web开发,了解的也不多,在这里记录一下我的第一个web项目启动的过程.网上教程很多,使用的java IDE 好 ...

  8. Tomcat记录-tomcat常用配置详解和优化方法(转载)

    常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...

  9. (转)JavaWeb学习之Servlet(一)----MyEclipse及Tomcat的配置

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4134921.html [开发环境] 物理机版本:Win 7旗舰版(64位 ...

随机推荐

  1. Ubuntu 安装和使用 Zip – rar – 7zip

    http://www.rongxuan.org/2013/08/13/ubuntu-%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8-zip-rar-7zip ...

  2. android 测试 Monkey 和 MonkeyRunner 的使用

    一.Monkey的使用 Monkey使用起来比较简单,简而言之就是模拟手机点击效果,随机发送N个点击动作给手机,主要对于程序的稳定和承受压力的测试. 1.首先连接上你的手机或者启动模拟器: 2.运行C ...

  3. 微信支付报错:Invalid thumbnail dimensions: 0x0

    微信支付的 android 端在支付的时候闪退, 调试信息: 10-08 10:17:08.459 2127-3946/? E/ActivityManager: Invalid thumbnail d ...

  4. js拖拽效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 使用FWTools来导入shp数据到mysql

    使用FWTools来导入shp数据到mysql 参考地址 http://forums.mysql.com/read.php?23,122827,206841 软件下载链接 http://fwtools ...

  6. sql转db,后台坑货

    打开 创建一个db文件然后点击文件--新建---Sqlite 导入空db成功后点击左侧栏 点击表 点击右上角+号把sql文件的语句复制粘贴到 然后点击运行,运行完成后保存ok

  7. Python里的编码问题

    马克一篇 http://bbs.chinaunix.net/archiver/tid-1163613.html http://www.openhome.cc/Gossip/Python/ImportI ...

  8. compare

    icompareble 默认的比较器 list.sort() compareto icompare Keyvaluepair<k,p>Where k:new()

  9. Extjs,Git,插件....学习网址

    详细的extjs讲解http://wenku.baidu.com/view/e98a781352d380eb62946de4.html 博客 http://www.cnblogs.com/iamlil ...

  10. Activity packagename has leaked window android.widget.PopupWindow$PopupDecorView{4f92660 V.E...... .......D 0,0-455,600} that was originally added here

    原因是在销毁Activity时,Activity中的popupwindow还处于显示状态. 解决方法是重写Activity的onDestroy()方法,在Activity销毁前调用popupWindo ...