springMVC解决ajax请求乱码的问题

前言:

最近在项目的使用过程中发现在springmvc的项目中,使用返回页面的请求方式,数据都能正常显示,但是对于ajax的请求,始终显示乱码。首先第一种是因为我们在web.xml中配置了spring的字符编码过滤器,那么使用ajax请求为什么就不行了呢?下面简单的分析一下,仅供参考。

先列出简单的请求代码:

浏览器端:

<script type="text/javascript">
$.ajax({
    type: "POST",
    url: "/pages/ajax",
    data: "name=garfield&age=18",
    success: function(data){
      console.log(data);
   }
  })
</script>

服务器端:

@ResponseBody
@RequestMapping("/ajax")
public String ajaxCharacter(){
  return "测试";
}

web.xml:

<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param><!-- 针对request -->
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param><!-- 针对response --> 
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

首先,当一个请求到来时,会先经过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 = “/test”,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,将请求处理改成如下:

@RequestMapping("/ajax")
public void ajaxCharacter(HttpServletResponse response) throws IOException{
  PrintWriter out = response.getWriter();
  out.print("测试");
  out.close();
}

以上就是解决springMVC的乱码问题,如有疑问请留言或到本站社区交流,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

springMVC解决ajax请求乱码的三种方法的更多相关文章

  1. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  2. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  3. Ajax简单的异步交互及Ajax原生编写

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象

  4. JSP中springmvc配置validator的注意事项

    这篇文章主要介绍了JSP中springmvc配置validator的注意事项的相关资料,并说明springmvc中spring-servlet.xml、applicationContext.xml的区别需要的朋友可以参考下

  5. Ajax跨域问题的解决办法汇总(推荐)

    本文给大家分享多种方法解决Ajax跨域问题,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧

  6. ajax编写简单的登录页面

    这篇文章主要为大家详细介绍了ajax编写简单登录页面的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. ajax从JSP传递对象数组到后台的方法

    今天小编就为大家分享一篇ajax从JSP传递对象数组到后台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  8. 解决ajax返回验证的时候总是弹出error错误的方法

    这篇文章主要介绍了解决ajax返回验证的时候总是弹出error错误的方法,感兴趣的小伙伴们可以参考一下

  9. SpringMVC拦截器和异常处理器使用示例超详细讲解

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下

  10. 使用AJAX完成用户名是否存在异步校验

    这篇文章主要介绍了使用AJAX完成用户名是否存在异步校验的相关资料,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部