http post请求带Content-Type=x-www-form-urlencoded出现中文乱码
对接第三方接口,他们的参数是带Content-Type=x-www-form-urlencoded的一个xml,请求参数的CharSetEncoding也是utf-8,但是取到的参数始终是乱码,没见过这种格式的乱码:【[₩ᄉヒ│ᆵユ¦ᄌᆳ₩ヨヌw对】应的中文是:【测试中文】,用postman测试,参数如下:
header中带有这个Content-Type 请求参数中含有中文后台使用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中预先对数据进行处理。
添加一个过滤器如命名为EncodingFilter,,这里主要操作就是把数据从inputStream里读出,然后放置到attribute里,并设置名称为c_xml,控制器中通过这个名称就能取到报文。
在web.xml中的最前面,配置好这个过滤器。
配置过滤器添加Controller,在这里获取过滤后的请求参数,进行正常操作:
Controller中获取过滤器拿到的参数操作完毕后测试访问,就不会中文乱码了,
网友评论