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请求中文乱码问题的主要内容,如果未能解决你的问题,请参考以下文章