解决SpringMVC获取请求参数乱码问题
使用配置:jdk18
- tomcat8.5.75 (由于10经常会出一些莫名其妙的问题,所以就让它去我的D盘吃灰了)
- IDEA 2021.3.2
- spring-framework-5.3.15
问题引出
当我们使用 SpringMVC 和 thymeleaf 进行请求参数的时候,习惯上会使用form搭配注解实现
例如如下代码:
<form th:action="@{}" method=" "></form>其中@{}里写路径,而 method 里有两种写法:一种是 post ,另一种是 get ,两种写法均会导致控制台或页面输出乱码问题由于get方法乱码是由于tomcat导致的,所以有根本解决方法,后续会说而post方法的乱码是因为我们没有设置相应编码,直接进行获取请求参数,况且,如果设置编码,但是如果有
<load-on-startup>1</load-on-startup>
获取参数在前,依然会导致乱码问题,所以我们需要在获取请求参数之前就要设置编码解决方案
get方法乱码解决方案
在 *tomcat* 文件夹里找到 *conf* 文件夹,里面的 *server.xml* 文件,点击编辑,找到

在这个位置,添加*URIEncoding="UTF-8"*即可解决
post方法乱码解决方案
正因为存在上述问题,所以我们需要考虑,是否存在比servlet执行时间更早的组件。
服务器三大组件:
- 监听器
- 过滤器
- servlet
而监听器是用于监听servletContext的创建和销毁,所以考虑只要当前我们访问的地址满足过滤路径,均会被过滤器进行过滤,所以我们选择在过滤器进行编码,且 SpringMVC 已经提供好,直接使用即可,所以我们在 *web.xml* 进行配置(PS:不管把filter写在哪,都会比 servlet 先进行初始化)

其中必须要写
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
通过源码可以看到



首先说一下为什么找到的是这个源码:
最主要的原因是参数里有*FilterChain*(过滤器链),有这个参数百分之八九十是执行过滤的
可以看到:
*encoding*可以为空,即我们需要重新设置,否则是默认编码,同时也是null,所以我们上面给*encodeing*设置为*UTF-8*,让它不为空
且 *forceRequestEncodeing* 和 *forceResponseEncodeing* 定义的时候均为 false
因为我们没有设置过 request.getCharacterEncoding() 所以默认还是null,因此第一个if语句就可以执行,也就是执行 *request.setCharacterEncoding(encoding);* 这条语句 (请求编码) 即
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>如果想要设置响应编码 就需要将下一个 if 语句也执行 , 执行条件可以看到是让 *isForceResponseEncoding()* 为 *true* 所以有
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>这样SpringMVC请求参数乱码问题就可以解决了~~
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java多线程 Producer and Consumer设计模式
这篇文章主要介绍了Java多线程 Producer and Consumer设计模式,producer是生产者的意思:指生产数据的线程,consumer是消费者的意思,指的是使用数据的线程,下文围绕Producer及Consumer展开话题,需要的朋友可以参考一下2021-10-10
详解Java8与Runtime.getRuntime().availableProcessors()
这篇文章主要介绍了详解Java8与Runtime.getRuntime().availableProcessors(),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06
生产环境NoHttpResponseException异常排查解决记录分析
这篇文章主要为大家介绍了生产环境NoHttpResponseException异常排查解决记录分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-10-10
一篇文章带了解如何用SpringBoot在RequestBody中优雅的使用枚举参数
这篇文章主要介绍了SpringBoot中RequestBodyAdvice使用枚举参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
SpringBoot+WebSocket实现即时通讯功能(J2EE方式)
WebSocket是一种在单个TCP连接上进行全双工通信的协议,WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,本文给大家介绍了SpringBoot+WebSocket实现即时通讯功能(J2EE方式),需要的朋友可以参考下2025-01-01


最新评论