使用配置: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执行时间更早的组件。服务器三大组件:1.监听器 2.过滤器 3.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请求参数乱码问题就可以解决了~~

完结撒花~

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

  1. SpringMVC 获取请求参数

    1.获取Request response对象 在SpringMVC的注解开发中,可以选择性的接收Request和Response对象来使用 2.获取request对象请求参数 a.通过request对 ...

  2. SpringMVC获取请求参数-POJO类型参数

    1.Controller中的业务方法的POJO参数的属性名与请求参数一致,参数值会自动映射匹配 1.创建POJO类 public class User { private String usernam ...

  3. SpringMVC获取请求参数-基本类型

    1.Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配 (json形式) <dependency> <groupId>com.faste ...

  4. SpringMVC关于请求参数乱码问题

    String names =request.getParameter("name") request主要接收的参数是form提交 form提交有的时候会伴随着乱码,该乱码的格式为I ...

  5. SpringMVC获取请求参数-集合类型

    1.创建User实体类 ```java public class User { private String username; private int age; public String getU ...

  6. 【SpringMVC】获取请求参数

    通过ServletAPI获取 test.html <a th:href="@{/testServletAPI(username='admin',password=123456)}&qu ...

  7. 学习SpringMVC——如何获取请求参数

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他(@CookieValue)!她(@ModelAndView) ...

  8. springMvc源码学习之:spirngMVC获取请求参数的方法2

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...

  9. SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  10. springMVC(spring)+WebSocket案例(获取请求参数)

    开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...

随机推荐

  1. 【Python】Python使用Tk实现动态爱心效果

    [Python]Python使用Tk实现动态爱心效果 深夜种下希望,梦中便能发芽 相对于之前的版本(晚上星月争辉,美梦陪你入睡),解决了看起来很卡.爱心跳动死板和外围光环不怎么灵动的问题,添加了文字功 ...

  2. 《机器人SLAM导航核心技术与实战》先导课:如何安装Ubuntu系统

    <机器人SLAM导航核心技术与实战>先导课:如何安装Ubuntu系统 视频讲解 [先导课]2.如何安装Ubuntu系统-视频讲解 [先导课]2.1.如何安装Ubuntu系统-操作系统概念- ...

  3. [SDR] 蓝牙专项教程 —— 从 0 到 1 教小白基于 SDR 编写蓝牙协议栈

    目录 前言 一.开题之作 二.动态发送 BLE 广播包 三.基于 PlutoSDR 实现 BLE 广播包的收发一体能力 四.基于 PlutoSDR 的 BLE 广播包的收发实现接入涂鸦智能 APP 教 ...

  4. cmd窗口中执行shell文件的方式

    使用cmd打开窗口后,使用powershell切入ps状态,然后使用sh命令即可执行shell文件,切入ps状态所在的目录为Administrator目录 bat设置Path变量 设置好sh.exe的 ...

  5. 通过一个DEMO理解MCP(模型上下文协议)的生命周期

    在LLM应用的快速发展中,一个核心挑战始终存在:如何让模型获取最新.最准确的外部知识并有效利用工具? 背景其实很简单:大模型(LLM)再强,也总有不知道的东西,怎么办?让它"查资料" ...

  6. grequests,并发执行接口请求的方法(简易版)

    有时候需要处理很多请求,显然,一个一个去处理是要花费很多时间的 我们就需要用到并发的方式,python并发请求的方法很多,从简单到复杂. 本案例,介绍一个超级简单,使用grequests库,实现并发请 ...

  7. vue3在构建时,使用魔法糖语法时defineProps和defineEmits的注意事项

    在 Vue 3.2+ 版本中,可以使用 <script setup> 替代传统的 script标签来编写组件,它提供了更简洁的语法来编写 Composition API 代码. 在 < ...

  8. FreeSWITCH中SIP网关(Gateway)操作

    freeswitch是一款简单好用的VOIP开源软交换平台. 以下是一篇关于FreeSWITCH中SIP网关(Gateway)操作的技术指南,基于提供的官方文档内容整理: 一.网关生命周期管理 1. ...

  9. Composer的常用命令和关于在哪儿查看composer可用包列表的问题

    1.安装: composer的安装就不用多说了,官网下载,一路next 中途貌似要让选择php.exe的所在目录. 2.常用命令: 1).配置/取消国内镜像仓库 /*配置国内镜像*/ composer ...

  10. c#运算符重载(operator)

    适用范围:C# 7.0及以上版本 C#学习-运算符重载(operator) - 百度文库 (baidu.com) 官网文档:Operator overloading - C# reference | ...