SpringMVC进行Ajax请求页面显示乱码
最近在项目的使用过程中发现在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());
}
}
SpringMVC进行Ajax请求页面显示乱码的更多相关文章
- SpringMVC响应Ajax请求(@Responsebody注解返回页面)
项目需求描述:page1中的ajax请求Controller,Controller负责将service返回的数据填充到page2中,并将page2整个页面返回到page1中ajax的回调函数. 一句话 ...
- 如何解决JSP页面显示乱码问题
一.JSP页面显示乱码 下面的显示JSP页面(display.jsp)就出现乱码: <html> <head> <title>JSP的中文处理</title& ...
- SpringMVC的AJAX请求报406错误
SpringMVC的AJAX请求报406错误原因有两种:1.jackson包没有引入 2.如果已经引入jackson包了还报406的错误,那么就有可能是请求的url路径是.html结尾,但是返回的数据 ...
- jquery Ajax请求中显示Loading...
jquery Ajax请求中显示Loading... $('#btnTest').click(function(){ $.ajax({ url ---- ,根据你需要设置 ...
- 关于PHP页面显示乱码问题的解决
关于PHP页面显示乱码问题的解决 网页乱码一直是网络编程高手都头痛的问题,我是一个PHP Web编程的初学者,学习当中也遇到了这个问题,查找了相关的资源,总结如下: 一般的中文编码:gb2312,gb ...
- SpringMVC 03: 请求和响应的乱码解决 + SpringMVC响应Ajax请求
请求或响应的中文乱码问题 tomcat9解决了get请求和响应的中文乱码问题,但是没有解决post请求或响应的中文乱码问题 tomcat10解决了get和post请求以及响应的中文乱码问题 考虑到实际 ...
- SpringMVC处理ajax请求的注意事项
.首先要知道ajax请求的核心是JavaScrip对象和XmlHttpRequest,而浏览器请求的核心是浏览器 ajax请求 浏览器请求 场景一:使用ajax获取session中的user 从上图可 ...
- SpringMVC处理ajax请求的跨域问题和注意事项
.首先要知道ajax请求的核心是JavaScrip对象和XmlHttpRequest,而浏览器请求的核心是浏览器我的个人博客(基于SSM,Redis,Tomcat集群的后台架构) github:htt ...
- angular ajax请求 结果显示显示两次的问题
angular 项目中,由于用到ajax 请求,结果显示如下情况 同样的接口,显示两次,其中第一次请求情况为 request method 显示为opttions 第二次的情况是 为啥会出现如此的情况 ...
随机推荐
- sass实现头条新闻列表页面
Index.html <!DOCTYPE html> <html> <head> <title>今日头条</title> <meta ...
- MySQL第六课
SELECT [DISTINCT] * /{字段名1,字段名2,字段名3,.........} FROM 表名 [WHERE 条件表达式1] [GROUP BY 字段名[HAVING 条件表达 ...
- oracle数据库应用开发经验
l 日志表应该以时间做分区,方便清理 一般应用都会有一些表用来记录用户操作日志,数据变更记录,交易流水等日志型的库表.这些表最好按时间字段做分区,这样在迁移或者清理历史记录时会比较方便,借助orac ...
- 第3章 关系数据库标准语言SQL(重点) | 数据库知识点整理
第3章 关系数据库标准语言SQL(重点) 了解 SQL语言发展过程 关系数据库技术和关系数据库管理系统RDBMS产品的发展过程 掌握 SQL语言的特点和优点 面向过程的语言和SQL语言的区别 关系数据 ...
- 【内推】2020微软苏州Office365众多核心团队热招150+研发精英!欢迎推荐
2020微软苏州Office365众多核心团队热招150+研发精英!欢迎推荐 大家好,目前微软Office365核心团队在美丽宜居的苏州有150多的社招职位虚位以待,欢迎大家自荐,推荐,转发!除以下列 ...
- CentOS8中进行IP和主机名的网络配置的过程图解
摘要: 很多人不知道如何在字符界面下配置主机名和ip,所以写了这个文章,本人也是新手,希望指出错误与不足.(本文只是在字符界面下教程) 一.输入你的账号密码登录 1)ifconfig 查看你目前的 主 ...
- python之三目运算符的替代品?
# 不知曾几何时,你是否也觉得Python的三目运算写起来很麻烦呢?(没有过) # 比如: a, b = 3, 4 c = a if a > b else b d = a if a < b ...
- centos 7 安装 Vue
一.安装npmyum install -y npm 二.更新组件yum update openssl 三.安装Vue最新稳定版本npm install vue最新稳定 CSP 兼容版本npm inst ...
- gulp常用插件之autoprefixer使用
更多gulp常用插件使用请访问:gulp常用插件汇总 autoprefixer这是一款自动管理浏览器前缀的插件,它可以解析CSS文件并且添加浏览器前缀到CSS内容里. 更多使用文档请点击访问autop ...
- linux commands - 一次性解压多个tar.gz文件
tar -zxvf list所有tar.gz文件,然后利用xargs将其作为参数传给tar命令.-n 1表示每次传一个参数. xargs: https://www.cnblogs.com/wangqi ...