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>

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

   

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐