环境: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. 用PowerMock mock final类

    mock final类相对简单,直接贴代码 被测方法: public class FinalEmployeeService { public void insertEmployee(Employee ...

  2. C++多线程3

    #include "stdafx.h" #include <windows.h> #include <process.h> int g_count; ; u ...

  3. Linux下man安装及使用方法

    常用法: man [section] name 其中: section 指的是手册页的哪个部分,可以是1.2.3…8.,若不指定,man会按照次序依次查找,知道找到第一个. name 指的是某个命令. ...

  4. Ext JS 4 老特征:statics 静态的变量和方法

    l   一.静态的变量和静态的方法 [译文原创Learning Ext JS 4 第51页] Statics的方法只属于类本身,而不属于任何一个实例,这就决定了我们是在定义类的内部来用statics方 ...

  5. R语言XML包的数据抓取

    htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...

  6. GeoHash原理解析

    GeoHash 核心原理解析       引子 一提到索引,大家脑子里马上浮现出B树索引,因为大量的数据库(如MySQL.oracle.PostgreSQL等)都在使用B树.B树索引本质上是对索引字段 ...

  7. 使用crosswalk优化ionic2应用包

    ionic plugin add cordova-plugin-crosswalk-webview --save

  8. UE4 Plugins插件分享:

    嘿,基佬你掉的插件! https://github.com/EverNewJoy/VictoryPlugin VictoryBPLibrary ---- 由活跃于 UE4 社区的某基佬 Rama 实现 ...

  9. 实验一、熟悉DOS命令

    实验一.熟悉DOS命令 实验一.熟悉DOS命令 一.        实验目的 1.从操作系统理论的观点来了解和掌握DOS有关用户接口的特点: 2.熟悉常用DOS操作命令(md.cd.rd.copy.m ...

  10. jQuery.pager无刷新分页

    刚刚学习前端的时候,需要一个无刷新的分页功能,找了一个不错的,大家也有很大分享,在这里写一个自己的部分代码,前后端都有,需要的小伙伴可以参考一下,代码不是完整的. 直接上伪代码<样式代码省略,部 ...