IE访问页面400报错,其他浏览器可正常访问

问题介绍:

背景:由于爆出Tomcat低版本内容中,存在Web Socket漏洞。因此安排Tomcat升级,本次升级到是Tomcat7.0.106。

问题:升级Tomcat服务器后,原有的所有含有中文链接在IE浏览器请求均报错HTTP-400,在谷歌chrome、360极速浏览器(极速模式)下均可正常访问。

                   

报错日志:

十一月 23, 2020 10:41:46 上午 org.apache.coyote.http11.AbstractHttp11Processor process
信息: 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。
java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
	at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:213)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1108)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:319)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

在参照网上调整Tomcat的server.xml,在Connector中加入

relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"

后并没有用,原本的连接设置也是支持UTF-8的,修改后配置:

<Connector port="8080" protocol="HTTP/1.1"
               maxThreads="1000" enableLookups="false" acceptCount="1000"
               connectionTimeout="30000" redirectPort="8444"
      	       disableUploadTimeout="true" URIEncoding="UTF-8" relaxedPathChars="|{}[],%:" relaxedQueryChars=":[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" useBodyEncodingForURI="true"/>

还是没有办法解决IE的访问出错。

解决办法:

1、调整IE的设置:Internet选项-高级-按图中勾选即可。(临时解决方案,所有用户都得改,改完还要重启....)

2、添加编码和解码(推荐解决方案,建议大家写代码还是参考规范,不要有中文类型的链接)

      1.js编码encodeURI(encodeURI(URL)),编码两次
      2.服务器端解码 URLDecoder.decode(request.getParameter("para"),"UTF-8")

3、降低Tomcat版本(治标不治本,而且本次就是为了修复安全漏洞对tomcat进行升级)

原因:

      IE6-IE11(Edge 不存在,可能修改了编码方案) 中文会被IE使用iso-8859-1编码 编码后的中文字符串带反斜杠,这是RFC文档中规定的不安全字符,Tomcat在高版本中增加的安全验证,凡是RFC 3986中非URL可携带的字符,都会返回400错误

涉及到的TOMCAT版本

  • 7.0.69+
  • 8.0.39+
  • 8.5.7

附 RFC 3986文档关于特殊字符的定义

  • RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、(-_.~)4个特殊字符以及所有保留字符。

  • RFC3986中指定了以下字符为保留字符:
    ! * ' ( ) ; : @ & = + $ , / ? # [ ]

  • 以下为不安全字符

  • 空格 Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉

  • 引号以及<> 引号和尖括号通常用于在普通文本中起到分隔Url的作用

  • 通常用于表示书签或者锚点

  • % 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码

  • {}|^[]`~ 某一些网关或者传输代理会篡改这些字符

 

参考链接:

1、https://www.cnblogs.com/mrmoo/p/9637924.html

2、https://blog.csdn.net/guanfengliang1988/article/details/73321358/

3、http://blog.sina.com.cn/s/blog_711ab1b10102x0v4.html

在IE内核访问页面时,可以通过JavaScript检测用户的IE浏览器版本,并根据版本提示用户浏览器版本过低。以下是使用JavaScript和HTML实现此功能的一个完整示例代码: ```html <!DOCTYPE html> <html> <head> <title>IE浏览器版本检测示例</title> <script type="text/javascript"> function checkIEVersion() { // 获取用户浏览器版本信息 var ua = window.navigator.userAgent; var msie = ua.indexOf('MSIE '); if (msie > 0) { // IE 10 之前版本 var ieVersion = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); if (ieVersion < 9) { // 浏览器版本低于9 alert('您使用的浏览器版本过低,请升级到IE9或更高版本以获得最佳体验。'); } } else { // 非IE浏览器或者IE11+ var trident = ua.indexOf('Trident/'); if (trident > 0) { // IE 11 var rv = ua.indexOf('rv:'); var ieVersion = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); if (ieVersion < 11) { // 浏览器版本低于11 alert('您使用的浏览器版本过低,请升级到IE11或更高版本以获得最佳体验。'); } } else { // 不是IE浏览器 alert('当前浏览器不受支持,请使用IE浏览器访问。'); } } } </script> </head> <body onload="checkIEVersion();"> <h1>浏览器版本检测页面</h1> </body> </html> ``` 这段代码中,当页面加载完成后,`checkIEVersion` 函数会被调用。该函数首先获取用户浏览器的用户代理(`navigator.userAgent`),然后解析出IE浏览器的版本号。如果版本号低于9,或者使用的是非IE浏览器,则会弹出提示框告知用户浏览器版本过低,并建议升级
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值