当前位置:首页 > 后端开发 > SpringMVC获取请求参数乱码问题

SpringMVC获取请求参数乱码问题

7个月前 (05-27)59
使用配置: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* 文件,点击编辑,找到

SpringMVC获取请求参数乱码问题 _ Java侠

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

SpringMVC获取请求参数乱码问题 _ Java侠

其中必须要写
<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>
通过源码可以看到

SpringMVC获取请求参数乱码问题 _ Java侠
SpringMVC获取请求参数乱码问题 _ Java侠
SpringMVC获取请求参数乱码问题 _ Java侠

首先说一下为什么找到的是这个源码:最主要的原因是参数里有*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请求参数乱码问题就可以解决了~~

完结撒花~

作者:你叫什么名字?我不信!
来源链接:https://blog.csdn.net/qq_52341302/article/details/123011894

标签: SpringMVC

“SpringMVC获取请求参数乱码问题” 的相关文章

SpringMvc @ResponseBody

SpringMvc @ResponseBody

  一.@Response使用条件 二. @Response在最小配置、jackson的jar包情况下,json中包含的日期类型字段都是以时间戳l...

SpringMVC之拦截器实现登录验证

SpringMVC之拦截器实现登录验证

今天回头看之前发的javaweb学习路线图,发现把路线图中的也学的有一半多了,不过还是路漫漫。在前面的博客中有学习过spring的aop,它利用动态代理实现,在springmvc中也是一...

SpringMVC 测试 mockMVC

SpringMVC测试框架 基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试。...

SpringMVC框架(一)

SpringMVC框架(一)

开篇 我在前面写了Spring,Mybatis的一些知识和用法,开始进入SpringMVC,进入SpringMVC我们就要知道它是哪里来的,是...

springmvc怎么访问html,Springmvc 访问html页面

springmvc怎么访问html,Springmvc 访问html页面

Springmvc 访问html页面0 原来配置完能访问jsp,现在想把一些jsp替换成html,出现404了。。修改了一下拦截和视图配置,没有用...

springmvc开发步骤

springmvc开发步骤

springmvc开发步骤 步骤①:导入springmvc相关坐标 步骤②:配置springmvc前端控制器 步骤③④: 步骤⑤:...

SpringMVC常用依赖

<!--spring核心--> <dependency> <groupI...

SpringMVC对Http请求的处理过程源码实现概要

SpringMVC对Http请求的处理过程源码实现概要

一、SpringMVC是什么? 老生常谈了,但是还是说一下我个人对SpringMVC的简单理解。SpringMVC将我们Servlet接口进行...

springmvc的核心流程

springmvc的核心流程

简单的模拟场景: 1.用户访问的url,就比如一个人进公司,必须要先经过公司的大门才能进去,请求也是一样,它必须先经过Dispatcher Servlet的前端控制器,...