Tomcat 9欢迎页index.html编码错误显示乱码问题排查求助
问题1:根路径访问欢迎页返回ISO-8859-1编码的原因
- 当访问根路径
/时,Tomcat会触发欢迎页规则,内部转发到配置的欢迎页(此处为index.html),这个转发过程中,Tomcat默认会为text/html类型的响应追加默认编码ISO-8859-1,优先级高于静态资源本身的处理逻辑。 - 直接访问
/index.html时,请求由Tomcat的DefaultServlet直接处理静态资源,默认不会为html类型资源追加charset参数,因此响应头只有Content-Type: text/html,浏览器会自动读取页面内meta标签声明的UTF-8编码,显示正常。 - 之前配置的AddDefaultCharsetFilter未生效,是因为默认Filter只拦截
REQUEST类型的请求,不会拦截内部转发的FORWARD类型请求,因此欢迎页的转发请求没有被Filter处理。
问题2:让欢迎页返回UTF-8编码的解决方案
方案1:配置HTML类型资源的默认MIME编码(最推荐,改动最小)
在你项目WAR包的WEB-INF/web.xml,或者Tomcat全局的conf/web.xml中,添加如下mime映射配置:
<mime-mapping> <extension>html</extension> <mime-type>text/html;charset=UTF-8</mime-type> </mime-mapping>
配置后重启Tomcat即可生效,所有html资源的响应头都会自动带上charset=UTF-8,不管是直接访问还是欢迎页转发访问都有效。
方案2:修正AddDefaultCharsetFilter配置
如果要继续使用默认编码过滤器,需要修改Filter的映射配置,增加对FORWARD请求的拦截,在web.xml中配置如下:
<filter> <filter-name>setCharacterEncodingFilter</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> <init-param> <param-name>ignore</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>setCharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
配置后重启Tomcat,过滤器就会处理欢迎页的转发请求,强制设置编码为UTF-8。
内容的提问来源于stack exchange,提问作者Shimbawa
相关产品推荐
相关产品推荐

