控制台报错Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

有时我们再页面和控制台中的json传递值时会遇到Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986报错,

查看网上大部分的解决方法和出现原因,大部分是因为tomcat的高版本导致的,因为现在的版本过高

tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。

具体来说,就是添加了些规则去限制HTTP头的规范性

 

具体来说:

org.apache.tomcat.util.http.parser.HttpParser#IS_NOT_REQUEST_TARGET[]中定义了一堆not request target

if(IS_CONTROL[i] || i > 127 || i == 32 || i == 34 || i == 35 || i == 60 || i == 62 || i == 92 || i == 94 || i == 96 || i == 123 || i == 124 || i == 125) {
                IS_NOT_REQUEST_TARGET[i] = true;
            }

转换过来就是以下字符(对应10进制ASCII看):

  • 键盘上那些控制键:(<32或者=127)
  • 非英文字符(>127)
  • 空格(32)
  • 双引号(34)
  • #(35)
  • <(60)
  • >(62)
  • 反斜杠(92)
  • ^(94)
  • TAB上面那个键,我也不晓得嫩个读(96)
  • {(123)
  • }(124)

   |(125)

  解决办法1:

  还是参考这里

  即:

  配置tomcat的catalina.properties

  添加或者修改:

  tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

   这种方法只适合对应的应为,如果为中文则就不行。如果有?和&这些符合那么

  tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&

  解决办法2:

  最轻便的方法,更换tomcat版本。此方法比较快

  解决办法3:

  对相应的参数进行编码,就是将所有的参数都进行编码

  解决方法4:

  选择另外的参数传递方法,比如post或者localStorage。

 我再项目中遇到的问题以上的方法都没有解决,后来再同事的指点下再tomcat的server。xml中添加

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"
/>

解决问题

 

追加一个有人提出的想法,

可以使用转义语句

例子  

location.href = encodeURI("./channelanalysis.do?userid=" + userid);
posted @ 2019-09-10 16:28  叫声大哥教你梳中分  阅读(1145)  评论(0编辑  收藏  举报