zoukankan      html  css  js  c++  java
  • Tomcat编码配置解疑

    环境: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

  • 相关阅读:
    动态规划(最长公共序列,最长上升序列)
    滴滴笔试--算术转移(20190827)
    线段树和树状数组
    pair和list学习
    数据结构--树(建立、遍历)
    tmux常用命令与快捷键
    机器学习实战-逻辑回归
    字符流中第一个重复的字符
    机器学习实战-朴素贝叶斯
    Python第三方库
  • 原文地址:https://www.cnblogs.com/tao_/p/3346414.html
Copyright © 2011-2022 走看看