jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记

http post请求带Content-Type=x-www-form-urlencoded出现中文乱码

对接第三方接口,他们的参数是带Content-Type=x-www-form-urlencoded的一个xml,请求参数的CharSetEncoding也是utf-8,但是取到的参数始终是乱码,没见过这种格式的乱码:【[₩ᄉヒ│ᆵユ¦ᄌᆳ₩ヨヌw对】应的中文是:【测试中文】,用postman测试,参数如下:

jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记_第1张图片
header中带有这个Content-Type
jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记_第2张图片
请求参数中含有中文

后台使用request.inputStream拿不到数据,要使用request.paraMap才能取到数据,但是又是乱码,各种网上的方法尝试后,终于在大佬的帮助下解决了这个问题。

1、request.inputStream拿不到数据而request.paraMap又乱码的原因

servlet对访问中带有这个Content-Type的参数会进行一个“自以为是”的解析,希望能帮助开发者将参数自动解析成ke-value形式的参数,然而它也只是通过参数中的等号“=”来进行分割的,还造成了中文乱码,解析执行formDataParser( 就是这个方法会把inputStream里的数据解析到parameterMap中的)。

2、抢在servlet解析参数前将参数获取到

 filter的生命周期在servlet执行formDataParser (就是这个方法会把inputStream里的数据解析到parameterMap中)之前因此可以在filter中预先对数据进行处理。


jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记_第3张图片

添加一个过滤器如命名为EncodingFilter,,这里主要操作就是把数据从inputStream里读出,然后放置到attribute里,并设置名称为c_xml,控制器中通过这个名称就能取到报文。

在web.xml中的最前面,配置好这个过滤器。


jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记_第4张图片
配置过滤器

添加Controller,在这里获取过滤后的请求参数,进行正常操作:


jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记_第5张图片
Controller中获取过滤器拿到的参数

操作完毕后测试访问,就不会中文乱码了,

你可能感兴趣的:(jfinal+kotlin/java获取Content-Type=x-www-form-urlencoded乱码的解决笔记)