请求或响应的中文乱码问题

  • tomcat9解决了get请求和响应的中文乱码问题,但是没有解决post请求或响应的中文乱码问题

  • tomcat10解决了get和post请求以及响应的中文乱码问题

  • 考虑到实际项目中服务器的更新速度(短时间不会都采用tomcat10)为了项目的通用性和可靠性,最好为请求和响应添加应对中文乱码的方案

  • 通过在web.xml中配置编码过滤器,对符合通配请求条件的请求可以进行自定义的编码设置

  • 编码过滤器一般在web.xml文件中进行其他配置之前配置,尽早解决可能出现的中文乱码问题

  • web.xml中新增对编码过滤器的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <!-- 配置编码过滤器 -->
<filter>
<filter-name>encode</filter-name>
<!-- 底层使用的过滤器 -->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--
(ctrl + alt + 点击上述CharacterEncodingFilter,查看源代码,可以看到需要以下参数)
private String encoding;
private boolean forceRequestEncoding;
private boolean forceResponseEncoding
-->
<!-- 向底层过滤器的参数赋值,进行编码的自定义配置 -->
<init-param>
<param-name>encoding</param-name>
<!-- 建议大写,小写有时解析不出来-->
<param-value>UTF-8</param-value>
</init-param> <init-param>
<!-- 对请求的编码解析采用encoding变量中的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param> <init-param>
<!-- 对响应的编码解析采用encoding变量中的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>encode</filter-name>
<!-- 指定对哪些请求进行过滤并进行编码配置处理-->
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

控制器中action方法的返回值

  • 控制器中的方法名称不一定含有action单词,但是一般习惯于把控制器中的方法称为action方法

  • 返回String:设置了视图解析器之后,可以自动拼接前缀和后缀,来作为客户端请求的资源地址,完成响应页面的跳转。还可以拼接字符串,返回指定的路径

  • 返回Object:使用jackson工具(要添加jackson的依赖)进行转换,自动将对象或者集合转为json格式的数据并返回

  • 返回void:无返回值,一般用于ajax请求

  • 返回基本数据类型:用于ajax请求

  • ModelAndView:返回数据和视图对象(现在用的较少)

响应ajax请求

  • 与前面SpringMVC博客集中的SpringMVC(指SpringMVC 02)项目相比,新增的配置如下
  • 在pom.xml中添加jackson依赖,为了可以利用SpringMVC自动返回json格式的数据
    <!-- 添加jackson的依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
  • 在webapp/js目录下添加jQuery函数库,为了前端可以使用jQuery封装的ajax()方法,便捷的发送ajax请求
  • webapp/index.jsp如下,是发送ajax请求并回显后端返回数据的前端界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index.jsp</title>
<script src="js/jquery-3.6.1.js"></script>
</head>
<body> <a href="javascript:showUser()">发送ajax请求,获取用户信息列表</a><br> <div id="userDiv">div,用来显示服务器返回的数据</div> <script type="text/javascript">
function showUser() {
//使用jQuery封装的ajax()发送ajax请求
$.ajax({
url:"${pageContext.request.contextPath}/list.action",
type:"get",
dataType:"json",
success:function (userList){
var data = ""
$.each(userList, function (i, user){
data += user.name + " ---- " + user.age + "<br>"
})
//将拼接好的数据回显在div中
$("#userDiv").html(data)
}
}
)
}
</script>
</body>
</html>
  • 新增控制器AjaxRequestAction,action方法上添加注解@ResponseBody,该注解专门用来解析ajax请求
package com.example.controller;

import com.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import java.util.ArrayList;
import java.util.List; @Controller
public class AjaxRequestAction { //只有当请求路径和ajax请求类型都对上时,目标方法才会被调用
@RequestMapping("/list")
@ResponseBody
public List<User> ajaxRequest(){//User类含有属性:name(String), age(int),无参和全参构造方法,全属性的getter,setter,toString方法
List<User> users = new ArrayList<>();
User u1 = new User("荷包蛋", 20);
User u2 = new User("饺子", 21);
User u3 = new User("橘子", 22);
users.add(u1);
users.add(u2);
users.add(u3);
return users;//SpringMVC框架会自动将对象数组转化为json数据格式返回给前端ajax请求
}
}
  • 在springmvc.xml文件需要新增注解驱动< mvc:annotationdriven /> ,为了用他来解析@ResponseBody注解,响应ajax请求
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 添加包扫描-->
<context:component-scan base-package="com.example.controller"/> <!-- 这里暂时不需要配置视图解析器,因为这里响应ajax请求,直接将请求到的数据以json格式返回给前端--> <!-- 对专门响应ajax请求的注解进行注解的驱动注册-->
<mvc:annotation-driven/>
</beans>
  • 部署并启动tomcat测试
  • 网站首页(left),发送ajax请求后的首页(right)如下:从后端获取到的数据经前端ajax拼接处理并填充在div中显示

SpringMVC 03: 请求和响应的乱码解决 + SpringMVC响应Ajax请求的更多相关文章

  1. JMeter:响应结果乱码解决方法

    JMeter:响应结果乱码解决方法 我们经常使用jmeter做接口测试或者正则匹配 看到的响应结果存在乱码,这是小白经常会问的问题,这是因为jmeter会按照jmeter.properties文件中, ...

  2. 解决.NET Core Ajax请求后台传送参数过大请求失败问题

    解决.NET Core Ajax请求后台传送参数过大请求失败问题 今天在项目上遇到一个坑, 在.Net Core中通过ajax向mvc的controller传递对象时,控制器(controller)的 ...

  3. springmvc框架下ajax请求传参数中文乱码解决

    springmvc框架下jsp界面通过ajax请求后台数据,传递中文参数到后台显示乱码 解决方法:js代码 运用encodeURI处理两次 /* *掩码处理 */ function maskWord( ...

  4. Jmeter HTTP请求后响应数据显示乱码解决方法

    Jmeter请求后结果树里无论是text还是html响应数据显示乱码,这是因为jmeter 编码格式配置文件默认不开启导致的,解决方法如下: 1)进入jmeter-***\bin目录下,找到jmete ...

  5. LoadRunner web请求和响应中文乱码解决办法

    先来认识下lr_convert_string_encoding: int lr_convert_string_encoding( const char *sourceString, const cha ...

  6. 关于解决JQuery发送Ajax请求后,IE缓存数据不更新的问题

    http://www.cnblogs.com/lys_013/archive/2013/08/07/3243435.html 今天在做ajax页面无刷新请求后台服务器数据的时候,IE下遭遇Ajax缓存 ...

  7. 16 react 发送异步请求获取数据 和 使用Redux-thunk中间件进行 ajax 请求发送

    1.发送异步请求获取数据 1.引入 axios ( 使用 yarn add axios 进行安装 ) import axios from 'axios'; 2. 模拟 在元素完成挂载后加载数据 并初始 ...

  8. SSM-SpringMVC-19:SpringMVC中请求和响应的乱码解决

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 配置一道拦截器即可解决乱码 配置方式如下: 在web.xml中: <!--过滤器处理乱码--> ...

  9. Katalon Studio之请求响应中文乱码解决方法

    最近在用Katalon做接口测试过程中发现请求响应消息中返回的中文均为乱码,这是因为我们使用的系统环境在初始安装时选择的中文简体,导致windows系统默认编码格式为GBK,但是KS的编码格式是UTF ...

随机推荐

  1. 驱动开发实战之TcpClient

    场景模拟 假设你有一批非标设备需要对接,对方提供了如下协议文档: 协议概述 设备作为TCPServer,端口6666 字节序:Little-Endian,即低地址存放低位 请求回复 需要你主动发起读取 ...

  2. BUUCTF-假如给我三天光明

    假如给我三天光明 打开压缩包可以看到一个海报,下方有盲文显示,通过对照表得知 盲文翻译为kmdonowg 通过盲文翻译得到的字符串解压压缩包得到一个音频文件 使用Audacity打开,看样子应该是摩斯 ...

  3. 学习C4C的视频分享

  4. 内存分析器 (MAT)

    内存分析器 (MAT) 1. 内存分析器 (MAT) 1.1   MAT介绍 MAT是Memory Analyzer tool的缩写.指分析工具. 1.2   MAT作用 Eclipse Memory ...

  5. pyhon推荐的命名规范

    类别 public Internal Modules(模块) low_with_under _low_with_under Packages(包) low_with_under   Classes(类 ...

  6. 零基础学Java(8)数组

    数组 数组存储相同类型值的序列. 声明数组 数组是一种数据结构,用来存储同一类型值的集合.通过一个整型下标(index,或称索引)可以访问数组中的每一个值.例如,如果a是一个整型数组,a[i]就是数组 ...

  7. React中useEffect的简单使用

    学习hooks 在 React 的世界中, 组件有函数组件和类组件 UI 组件我们可以使用函数,用函数组件来展示 UI. 而对于容器组件,函数组件就显得无能为力. 我们依赖于类组件来获取数据,处理数据 ...

  8. 我们应该测试 DAO 层吗?

    应该测试 DAO 层吗? 网上有很多人讨论单元测试是否应该包含 DAO 层的测试.笔者觉得,对于一些主要是crud的业务来说,service层和controller层都会非常薄,而主要的逻辑都落在ma ...

  9. 解决报错Error response from daemon: Get https://10.0.0.110/v2/: dial tcp 10.0.0.110:443: connect: connection refused

    修改 #https不需要验证,否则要加上以下配置# 意思就是非安全仓库,加上重启就OK了! vim /lib/systemd/system/docker.service --insecure-regi ...

  10. FPGA开发流程(创建工程,选择芯片,变量位置,文件命名,reg和wire数据类型,开发流程)

    开发流程(以二选一选择器为例) 1.设计定义:设计一个可以从两个输入端中选择其中一个并输出的逻辑电路 2.设计输入 2.1.逻辑抽象:三个输入端,一个用来选择,记sel,另两个被选择,记a,b,加上一 ...