一.概述
Tomcat对http请求的字符编码支持得有些混乱,使用起来动不动就发生乱码的情况。通过窥探tomcat的源码,对http request的字符编码这块的处理机制作一个总结。
tomcat内部对于http request,有两种字符编码的配置:
1. 对应get方式的http请求的字符编码
2. 对应post方式的http请求的字符编码
二.get方式的字符编码
第一种情况:get和post的编码保持一致,post方式的编码是什么,get方式的编码就是什么。
server.xml中进行如下配置的话,get方式的字符编码和post方式的字符编码保持一致。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
第二种情况:不指定useBodyEncodingForURI或者useBodyEncodingForURI="false"。
这时get和post的字符编码各自设置,互相没有关系。配置方法如下:
通过server.xml文件的URIEncoding进行设置,如果没有配置URIEncoding,那么用缺省的ISO-8859-1。
<Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>
三.post方式的字符编码
1. 如果在servlet的doPost方法中或者filter中设置了request的字符编码,那么就以设置的为准。
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
//必须在getParameter,getParameterNames,getParameterValues方法调用之前进行设置
request.setContentType("UTF-8");
}
web.xml中配置filter
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
2. 如果没有进行1.的配置,那么从http header中取出content-type,然后从content-type的值中取出charset的值,
用charset的值作为post的字符编码。
如:content-type=application/x-www-form-urlencoded;charset=utf-8
那么,post的字符编码就是utf-8。
如果从http header中没有取到content-type或者charset,那么,就使用缺省的ISO-8859-1。
分享到:
相关推荐
tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-...
tomcat-redis-session-manager源码
开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...
旦容器初始化已经结束,调时就会出现异常:2022/2/23 下午8:40Tomcat 源代码调试笔记 - 看不见的 Shell我看了下这个 if 之后的语句,并
Tomcat8亲测可用 tomcat-redis-session-manager的jar包 修改了tomcat-redis-session-manager源码进行的编译生成的jar包
Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)
因tomcat7使用redis共享session,其他的包存在问题,自己编译后处理通过。 该包是在https://github.com/jcoleman/tomcat-redis-session-manager 将源码编译后的包。
apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...
文件名写错了,此压缩文件支持tomcat8.5。是否支持8.0请自行测试,本人只测试了8.5,可以使用。压缩文件包括tomcat-redis-session-manager-master-2.0.0.jar、jedis-2.7.3.jar、commons-pool2-2.3.jar三个jar包使用...
基于tomcat-redis-session-manager源码进行的编译生成的jar包,压缩包中包含Tomcat7和Tomcat8打好的jar包。
用于配置 tomcat-redis-session-manager
使用tomcat-redis-session-manager进行统一session管理所需jar包,包括tomcat6-jdk6、tomcat7-jdk7、tomcat8-jdk8
apache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-tomcat-9.0.45-srcapache-...
包括commons-pool-1.6.jar,jedis-2.0.0.jar,tomcat-redis-session-manager-1.2-tomcat-6&7.jar
tomcat-redis-session-manager的jar包,适用tomcat7版本。jar构建来自GitHub上开源项目打包
tomcat-redis-session-manager-1.2-tomcat-7.jar 和tomcat的context.xml配置文件。 2.7.2版包含 commons-pool2-2.4.1.jar jedis-2.7.2.jar tomcat-redis-session.jar 和tomcat的context.xml配置文件
3-6Tomcat处理源码实现与异步Servlet源码实现(1).mp4
tomcat-redis-session-manager-1.2.jar redis+tomcat session共享需要的jar包,包括tomcat6和tomcat7
tomcat 7 最新版本 apache-tomcat-7.0.109