参考资料:http://m.oschina.net/blog/376339

乱码的本质是涉及到编解码的几个过程所用的编码方式不一样。

一、从服务端到客户端

在整个服务器端数据返回到浏览器的过程中,涉及到三次编码:

第一次:java文件以什么编码存放在硬盘中

第二次:字符串是以什么编码方式转换成字节数组的,若未指定@RequestMapping的produces属性,同时也未给StringHttpMessageConverter指定编码方式,则字符串默认是以ISO-8859-1形式转换成字节数组的。

    可以通过produces = "text/html;charset=UTF-8"来指定编码:@RequestMapping(value = "/register", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")

第三次:数据发送给浏览器后,浏览器接收到一堆字节数组,浏览器又是以什么编码方式来解码的。

只有三者统一才不会出现乱码。具体见上述参考文章。

二、客户端到服务端

此过程涉及到两次编码:

第一次:当你输入http://localhost:8080/test?name=中国   的时候,浏览器将以什么样的编码方式将中国转化成字节数组,这称为URL编码 。不同的浏览器会采用不同编码方式来将 中国 转换成字节数组,一般为UTF-8;而程序中按默认编码对中文进行url encode,中文环境一般为GBK,这点应注意。

第二次:当浏览器发送请求时,服务器是以请求的content-type来解析请求数据的,当浏览器请求没有指定content-type时,不同的服务器应该有不同的策略,并且可以进行设置。

如Tomcat服务器,默认采用的是ISO-8859-1(不支持中文),可以通过修改Tomcat的conf/server.xml文件,在Connector标签中增加 URIEncoding='UTF-8' 来修改Tomcat的默认编码解析方式(在Tomcat 8中默认已为UTF-8,这个应特别注意,否则经下面所说的代码方法处理后的代码放在Tomcat8反而会乱码,笔者就因为这个原因导致本机能正确跑的代码放在生产环境中后跑的结果不正确,浪费了好多时间);

对于默认采用的是ISO-8859-1的服务器,此也可以通过在代码中解码再编码数据来解决乱码:

// GET方式:http的url传过来的数据Tomcat默认是用iso-8859-1(不支持中文)解码的,故数据先用iso-8859-1编码得到原文后再用与url相同的编码方法解码
userName = new String(userName.getBytes("iso8859-1"), "utf-8");

三、java Servlet中中文乱码

1、post

对于post方法中的乱码,浏览器通常是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收。

可以通过request.setCharacterEncoding("utf-8");解决;或在代码中解码再编码数据来解决乱码

2、get

在代码中解码再编码数据来解决乱码

Spring MVC GET 从客户端数据到服务器端的乱码和服务器端数据到客户端的乱码的更多相关文章

  1. spring mvc $.ajax没有指定contentType ,导致后台无法接收到数据

    var formData = JSON.stringify(this.rows); //将表单中的数据转为字符串 $.ajax({ type: "post", url: 'http ...

  2. Spring MVC教程——检视阅读

    Spring MVC教程--检视阅读 参考 Spring MVC教程--一点--蓝本 Spring MVC教程--c语言中午网--3.0版本太老了 Spring MVC教程--易百--4.0版本不是通 ...

  3. 浅谈Spring MVC知识

    关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...

  4. Spring企业级程序设计 • 【第6章 深入Spring MVC开发】

    全部章节   >>>> 本章目录 6.1 模型数据解析及控制器返回值 6.1.1 ModelAndView多种用法 6.1.2  Map添加模型数据和返回String类型值 6 ...

  5. Spring MVC参数绑定(如何接收请求参数及返回参数)

    在SpringMVC interceptor案例实践中遇到了获取jsp表单传递参数失败的问题,怎么的解决的呢?下面详细介绍. 先讲述下https://www.cnblogs.com/ilovebath ...

  6. spring笔记2 spring MVC的基础知识2

    2,spring MVC的注解驱动控制器,rest风格的支持 作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器: @RequestMapping处理用户的请求,下面 ...

  7. [Spring MVC] - Annotation验证

    使用Spring MVC的Annotation验证可以直接对view model的简单数据验证,注意,这里是简单的,如果model的数据验证需要有一些比较复杂的业务逻辑性在里头,只是使用annotat ...

  8. Spring MVC 项目搭建 -5- spring security 使用数据库进行验证

    Spring MVC 项目搭建 -5- spring security 使用数据库进行验证 1.创建数据表格(这里使用的是mysql) CREATE TABLE security_role ( id ...

  9. Spring MVC 数据绑定流程分析

    1.    数据绑定流程原理★ ①   Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...

  10. Spring MVC中的模型数据处理

    一.综述 Spring MVC 提供了以下途径来输出模型数据: 1.ModelAndView 当处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据到请求域. 2.Ma ...

随机推荐

  1. Go Walk教程 - 流程控制( switch)

    Go的 switch 非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项,不要break: var score =98 var result string switch score/ ...

  2. 矩形覆盖-我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    class Solution { public: int rectCover(int number) { ; ; ; ||number==) ; ) ; ;i<number+;i++){ res ...

  3. Eclipse里面启用genymotion

    E:/Users/zhuxuekui/AppData/Local/Android/sdk as里面的SDK目录 1.打开eclipse并从云仓库里面下载genymotion插件 注意:这里面有一个坑, ...

  4. cannot change version web module 3.0

    eclipse如何修改dynamic web module version 由于从SVN down下来的工程java及tomcat 版本比本地高,导致工程不能编译,报以下错误. 1.Java comp ...

  5. jQuery使用ajax跨域获取数据

    var webMethod = "http://localhost:54473/Service1.asmx/HelloWorld";  jQuery.support.cors = ...

  6. GPS坐标换算为百度坐标

    最近在做一个关于手机定位的小应用,需求是这样的,用户通过手机(Wp8)进行二维码扫描操作并且记录用户的当前位置,在PC上可以查看用户所在地图的位置,做法就是在用户扫描条码时,通过手机GPS获取当前在地 ...

  7. 执行mount命令时找不到介质或者mount:no medium found的解决办法

    使用vmware时,在虚拟机设置里,设置CD/DVD为系统镜像,挂载时,有时会有找不到介质或者no medium found之类的提示. 根本原因是iso镜像并没有加载到虚拟机系统内. 解决办法: 首 ...

  8. Activiti系列: 如何添加自定义表单引擎

    这个功能挺有意思的,有了它,就可以不适用html的方式来展示表单了,比如可以用swing对象了 class MyFormEngine implements FormEngine {     @over ...

  9. scrollview中套listView的问题,记录一下。

    开发一个订单详情界面,详情界面上面要显示收货地址.订单总金额等,中间部分要一个listView,下面还有一些东西 但是一个界面显示不全,肯定要scrollview,然后发现listView竟然只显示第 ...

  10. 关于JavaScript打印去掉页眉页脚

    因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root, ...