IE与Tomcat与HTTP1.1

最近公司终于舍得统一Tomcat和JDK的版本号了。为了保证权威性和正确性,本人特意去各自的官网上下载了当前的最新版本。

在实际的内部测试和验证过程中,发现了一些细节问题是之前开发过程中忽略了的,所以有了这篇博客,希望可以帮助后来者避免类似的弯路。

1. 概述

在实际测试过程中,碰到的细节问题表现如下:

当所请求URL地址的Query String部分中包含中文(例如/dhmain.html?a=201706260007&b=我是中国人)时,表现出如下现象:
1. 使用Chrome浏览器,Tomcat 7.0.90; 链接正常展示。
2. 使用Chrome浏览器,Tomcat 7.0.90; 在上述的Query string 中加入一个 {, 刻意违反RFC规范,报错。
3. 使用IE浏览器,Tomcat 7.0.90; 链接报错400,Tomcat后台报错:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
4. 使用IE浏览器,Tomcat 7.0.5; 链接正常展示。

2. 分析

借助Tomcat提供详细错误堆栈信息,以及一番分析。大致总结了几个要点如下:

2.1 浏览器对URL的处理
  1. url是不支持非ASCII字符的,当地址栏url路径带中文参数时,就会产生乱码。
  2. 一般浏览器会自动帮我们进行urlencode的十六进制编码,并且urldecode的解码也会由tomcat帮我们自动完成。
  3. 但是 IE浏览器不会对url里进行编解码处理。
  4. urlencode和urldecode

再看了太多理论性知识之后,我们现在来看看一个实际的例子,以下分别是Fiddler抓取到的在IE浏览器和Chrome下请求http://lq-pc:18080/strutsDemo/dhmain.html?a=201706260007&b=我是中国人时的HTTP协议内部:

IE浏览器下
IE浏览器时

Chrome浏览器
Chrome浏览器

对比非常清晰,显而易见地在IE浏览器下,URL中的中文并不会进行编码。所以在严格执行HTTP1.1规范的Tomcat版本下必然要出现相关错误。

关于这一点,一个更直接的反馈就是,直接将各个浏览器地址栏中内容拷贝到文本编辑器里,就会很清晰的发现: IE地址栏中的保持原样,而Chrome地址栏的则进行了一次UTF-8编码。

存疑的解决方案
另外需要补充一句的话,网上给出一个解决方案,本人在实际的测试过程中发现并不能保证成功,但也贴在这里,看官请自行把握。

在IE internet选项中找到如下设置,选中打勾如图
在IE internet选项中找到如下设置,选中打勾如图

附上相应的链接 : https://www.cnblogs.com/leelugen/p/6690186.html

2.2 Tomcat对HTTP1.1规范的支持

从下面这几个版本开始,都需要强制支持 7230 and RFC 3986

tomcat 9.x: 9.0.0.M12 (not released 未正式发布)
http://tomcat.apache.org/tomcat-9.0-doc/changelog.html#Tomcat_9.0.0.M12_(markt)

tomcat 8.5: 8.5.7 (not released 未正式发布)
http://tomcat.apache.org/tomcat-8.5-doc/changelog.html#Tomcat_8.5.7_(markt)

tomcat 8.x: 8.0.39
http://tomcat.apache.org/tomcat-8.0-doc/changelog.html#Tomcat_8.0.39_(violetagg)

tomcat 7.x: 7.0.73
http://tomcat.apache.org/tomcat-7.0-doc/changelog.html#Tomcat_7.0.73_(violetagg)

所以对于历史债比较重的项目,若有更换Tomcat要求的,还是推荐选用合适版本的Tomcat,例如 apache-tomcat-7.0.72 ; apache-tomcat-8.5.6 。

  1. get请求 IE 中文报 HTTP 400 错误
  2. HTTP/1.1 specification - RFC7230
  3. Tomcat - Connector配置 - 其中关于属性 relaxedPathChars 和 relaxedQueryChars 的配置说明

猜你喜欢

转载自blog.csdn.net/lqzkcx3/article/details/81449435