IE浏览器链接WebSocket报错:java.lang.IllegalArgumentException: Invalid character found in the request target

  在项目开发中整合了WebSocket,原本没什么问题了,可是偶尔发现用IE浏览器打开web端不能推送消息,由于PC端与服务器创建链接失败了。网上查了不少资料,前端

又看了看源码,都不对症;又怀疑是SpringBoot版本的问题,可是换了版本仍是不行。楼主用demo跑了一遍发现没有问题,但就是在项目中不能创建链接,再认真调试发java

现第一次创建链接的时候后台有一个报错,内容以下:web

2020-03-25 09:12:37.348  INFO 5580 --- [0.0-8080-exec-3] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:476) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_202]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_202]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]

  报错:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986说的很明白,貌似是什么特殊字符引发的?真是奇了apache

怪了,楼主就是在创建WebSocket链接的时候传了一个Json字符串而已,没有什么奇怪的字符才对。用这个报错描述再查百度了一下,终于找到了想要的答案。json

  这个问题跟Tomcat版本有关,Tomcat高版本中的一个新特性:严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只容许包含英文字母(a-zA-Z)、浏览器

数字(0-9)、-_.~4个特殊字符以及全部保留字符(RFC3986中指定了如下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。很明显,确实是字符引发的报错,楼主在url中传tomcat

了一段json,传入的参数中有”{“和“"”,花括号和双引号不在RFC3986中的保留字段中,因此就报错了。服务器

  楼主的解决办法是,创建链接的时候,在传的json字符串参数中把“{“和”}”这两个字符去掉,同时前端的json本身拼接,里面的字段名和字符串都用单引号,好比创建链接app

正常的路径是ws://127.0.0.1:8080/webSocket/{param},要接收一个参数做为鉴权和业务须要,为了不参数中的字符问题,拼接一个这样的地址:url

    ws://127.0.0.1:8080/webSocket/'userId':'3a05d7f26c8246bbbbec6b80da86c741','token':'090139d320b4257b43a4b3fb4faf9fda3527344e8145'

后台接收到参数之后,本身加上先后的花括号,这样就能够解析json了,简单粗暴,可是有效,哈哈哈。。。

  固然了,网上正规的解决方法:

  参考https://bz.apache.org/bugzilla/show_bug.cgi?id=60594,说从如下版本开始,有配置项可以关闭/配置这个行为:

    8.5.x系列的:8.5.12 onwards
    8.0.x系列的:8.0.42 onwards
    7.0.x系列的:7.0.76 onwards

  解决办法就是:…/conf/catalina.properties中,找到最后注释掉的一行

    #tomcat.util.http.parser.HttpParser.requestTargetAllow=|  ,

  改为

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

  而后去掉这句话的注释。

  这种方法楼主没有试过,有兴趣的同窗能够本身尝试一下。

相关文章
相关标签/搜索