参考资料: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. Windows Phone:如何检查WMAppManifest中的Capability属性

    在Windows Phone应用中有一个应用程序清单(WMAppManifest.xml),其中对于不同的应用可以设定Capability来告知需要哪些特性或功能,详细内容可以参考官方文档: http ...

  2. ios 指南针

    指南针图片  IBOutlet UIImageView *compassView 1 #import "ViewController.h" #import <CoreLoca ...

  3. qt中文乱码问题

    首先,声明一下,QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望的字符串正确赋给QString. 很简单的问题,"我是中文&qu ...

  4. C#脚本引擎 CS-Script 之(一)——初识

    最近在做新产品,这个产品需要满足不同项目对于系统的定制性数据处理需求,比如有的要统计一段时间内某开关打开关闭了多少次,有的要统计一段时间内空调的使用率,有的希望根据温度来控制空调的开还是关,有的则是希 ...

  5. [CareerCup] 11.8 The Rank of Number 数的排行

    11.8 Imagine you are reading in a stream of integers. Periodically, you wish to be able to look up t ...

  6. Github克隆别人的库

    一. 首先在网站上进入别人的库(通过别人提供的链接或者自己在页面上查询),然后在右下方选择SSH,将链接复制下来. 二. 在你的电脑上新建一个与人家库名相同的文件夹,然后在文件夹上右击,在弹出菜单上选 ...

  7. iOS从App跳转至系统设置菜单各功能项的编写方法讲解

    跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSUR ...

  8. JAVA并发的性能调整

    1.互斥技术 synchronized Lock Atomic 性能比较Atomic >  Lock  > synchronized,当然这不是绝对的.当线程数比较少时,synchroni ...

  9. iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法

    一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...

  10. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...