解决SpringMVC获取请求参数乱码问题

 更新时间:2024年11月04日 09:39:34   作者:你叫什么名字?我不信!  
在使用SpringMVC和thymeleaf进行请求参数处理时,可能会遇到乱码问题,对于GET方法乱码,可通过修改Tomcat的server.xml文件,添加URIEncoding="UTF-8"解决,而POST方法乱码,则需在web.xml配置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将本地项目部署到Linux服务器的实践

    Java将本地项目部署到Linux服务器的实践

    本文主要介绍了Java将本地项目部署到Linux服务器的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06
  • Hbase、elasticsearch整合中jar包冲突的问题解决

    Hbase、elasticsearch整合中jar包冲突的问题解决

    本篇文章主要介绍了Hbase、elasticsearch整合中jar包冲突的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • CountDownLatch基于AQS阻塞工具用法详解

    CountDownLatch基于AQS阻塞工具用法详解

    这篇文章主要为大家介绍了CountDownLatch基于AQS阻塞工具用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • javaSE,javaEE,javaME的区别小结

    javaSE,javaEE,javaME的区别小结

    本篇文章小编就为大家简单说说JavaSE、JavaEE、JavaME三者之间的区别,需要的朋友可以过来参考下,感兴趣的小伙伴们可以参考一下
    2023-08-08
  • NoHttpResponseException问题排查解决记录分析

    NoHttpResponseException问题排查解决记录分析

    这篇文章主要为大家介绍了NoHttpResponseException问题排查解决记录分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 实战分布式医疗挂号系统登录接口整合阿里云短信详情

    实战分布式医疗挂号系统登录接口整合阿里云短信详情

    这篇文章主要为大家介绍了实战分布式医疗挂号系统登录接口整合阿里云短信详情,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-04-04
  • Springboot设置文件上传大小限制的实现示例

    Springboot设置文件上传大小限制的实现示例

    Spring Boot工程嵌入的tomcat限制了请求的文件大小默认为1MB,单次请求的文件的总数不能大于10Mb,本文主要介绍了Springboot设置文件上传大小限制的实现示例,感兴趣的可以了解一下
    2023-11-11
  • Java中JWT的使用的详细教程

    Java中JWT的使用的详细教程

    JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输,本文介绍了Java中JWT的使用,需要的朋友可以参考下
    2023-02-02
  • Java中的Kafka为什么性能这么快及4大核心详析

    Java中的Kafka为什么性能这么快及4大核心详析

    这篇文章主要介绍了Java中的Kafka为什么性能这么快及4大核心详析,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 使用java代码实现一个月内不再提醒,通用到期的问题

    使用java代码实现一个月内不再提醒,通用到期的问题

    这篇文章主要介绍了使用java代码实现一个月内不再提醒,通用到期的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论