webflux解决get请求中文乱码问题

Posted 当以乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webflux解决get请求中文乱码问题相关的知识,希望对你有一定的参考价值。

     Webflux是Spring中一个非阻塞的框架,使用方式类似SpringMVC.最近用该框架做了个网关服务的重构.因为其中遇到了些问题.比较难解决的就是这个GET请求如果包含中文且发送时候没有用URL编码的话,直接就乱码了.无法进行后续的处理了.报错如下:

     

org.springframework.http.server.reactive.ReactorHttpHandlerAdapter - Invalid URL for incoming request: Illegal character in query at index

      发现这个问题后.首先尝试通过Filter的方式来解决乱码问题.按照官方文档增加了filter.发现ReactorHttpHandlerAdapter这个方法是在filter之前执行.该方法尝试失败.

     后面通过查看netty源码发现其最后会调用 HttpServerCodec.decode  到

HeaderParser.process 方法使用的是ASC解码的方式.每次读取的是一个byte位信息.故而产生了乱码.要想解决这个问题.那么需要做类似于tomcat的 URIEncoding="utf-8"的设置应该就可以解决改问题.后面查看官方文档.没有找到如何设置.到此该方法展示无效了.顺便给官方提交了一个issues

理论上应该是可以设置的.如果你知道方法可以留言告诉我.

     这个方法也行不通.那我打算直接从底层的服务器容器下手来解决该问题.因为官方文档上指出webflux的底层容器是支持tomcat,jetty,servlet3.1+,netty等方式.因为jetty默认就是支持URIEncoding="utf-8"的,所以这里我直接用jetty来对默认的netty容器进行替换.

    只需要修改pom文件如下:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-reactor-netty</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
   <!-- use jetty default URIEncoding is UTF-8 ,Chinese GET request garbled -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>

再次运行后,发现已经解决该问题了

   

以上是关于webflux解决get请求中文乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

webflux解决get请求中文乱码问题

webflux解决get请求中文乱码问题

webflux解决get请求中文乱码问题

Vue get发送请求中文乱码问题

get请求 解决乱码问题

详解get请求和post请求参数中文乱码的解决办法