SpringMVC进行Ajax请求页面显示乱码
2024-08-31 14:38:13
最近在项目的使用过程中发现在springmvc的项目中,使用返回页面的请求方式,数据都能正常显示,但是对于ajax的请求,始终显示乱码。
首先第一种是因为我们在web.xml中配置了spring的字符编码过滤器,那么使用ajax请求为什么就不行了呢?
下面简单的分析一下,仅供参考。
先列出简单的请求代码:
//Java代码
@Controller
@RequestMapping("Goods")
public class GoodsController { @RequestMapping(value="page")
@ResponseBody
public String page(){
JSONObject jo = new JSONObject();
jo.put("page", "测试");
return jo.toString();
}
}
<!-- Ajax代码 -->
$.ajax({
url : "/EASY_BUY_SSM/Goods/page.action",
type : "POST",
contentType : "application/x-www-form-urlencoded",
dataType : "json",
success : function(data) {
var page = data.page;
var goodsList = page.newsList;
apendGoods(goodsList);
}
});
<!-- web.xml --> <filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.smy.util.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
首先,当一个请求到来时,会先经过spring的这个过滤器CharacterEncodingFilter,过滤器设置好编码之后会
进入springmvc的这个DispatcherServlet,通过springmvc的一系列转化(此处省略。。。),到达我们的控制层,
并且帮我们封装好了参数。在springmvc中配置这个配置项之后<mvc:annotation-driven>
,会默认配置
RequestMappingHandlerAdapter和HttpMessageConverter,当我们使用@ResponseBody时,那么数据返回时
会调用这个数据转换器。经过查看源码可知,默认情况下会转换成ISO-8859-1格式。
简单源码附上:
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
private final Charset defaultCharset;
private final List<Charset> availableCharsets;
private boolean writeAcceptCharset; protected void writeInternal(String s, HttpOutputMessage outputMessage)
throws IOException {
if (this.writeAcceptCharset) {
outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
}
Charset charset = getContentTypeCharset(outputMessage.getHeaders()
.getContentType());
StreamUtils.copy(s, charset, outputMessage.getBody());
} ...
} public abstract class AbstractHttpMessageConverter<T> implements
HttpMessageConverter<T> {
protected final Log logger = LogFactory.getLog(super.getClass()); private List<MediaType> supportedMediaTypes = Collections.emptyList(); ...
}
通过上面的源码可以看出,对于字符串会自动编码成默认格式ISO-8859-1,所以对应的就有解决方案。
方案一:
@RequestMapping(value = “page”,produces=”text/html;charset=UTF-8;”)
方案二:
此注解需要注意的是一定要使用spring 3.1.x 以上。
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
方案三:
不使用@ResponseBody,将请求处理改成如下:
//Java代码
@Controller
@RequestMapping("Goods")
public class GoodsController { @RequestMapping(value="page")
public void page(HttpServletResponse response){
JSONObject jo = new JSONObject();
jo.put("page", "测试");
response.getwriter().write(jo.toString());
}
}
最新文章
- 字符串转化为Json格式的数据--(记录四)
- 简单的解释XSS攻击
- mysql case then使用
- 从数组中选出和等于固定值的n个数(JavaScript实现)
- x2go
- python 数据结构-列表
- DEDECMS中,文章页直接输出字段名
- VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。
- 具体解释EBS接口开发之物料导入API
- commands - `tar`
- Mysql安全机制
- JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)
- Git 配置editor编辑器
- ZOJ - 3469 Food Delivery (区间dp)
- 吐槽一下--最近多次在腾讯以及万科的面试经历---Web前端与PHP后端开发
- 深入浅出Git教程(转载)
- Golang 入门系列(三)Go语言基础知识汇总
- ES6 let&;const
- openSUSE Leap 15.0 Adobe Flash Player 安装说明
- (最长回文子串 线性DP) 51nod 1088 最长回文子串
热门文章
- Unbuntu--安装VMware Tools
- LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree
- malloc分配内存的结构
- shadow文件中密码的加密方式
- DataReader类型化数据读取与装箱性能研究
- JAVA->;查询并显示输入根目录下全部的文件所在目录路径
- P1041 传染病控制【暴搜】
- ACM-ICPC 2018 焦作赛区网络预赛 Give Candies 题解
- ECMAScript基本语法——⑤运算符 void
- Qt Installer Framework翻译(8)