背景

  从Tomcat5.x开始,GET,POST方法提交信息,Tomcat采用不同的方式来处理编码。
  对于GET请求,Tomcat不会考虑使用request.setCharacterEncoding("UTF-8")设置的编码,而会永远使用ISO-8859-1编码。
  对于POST请求,Tomcat会使用request.setCharacterEncoding("UTF-8")设置的编码,如果没有设置,则使用"ISO-8859-1"。

  1 get方式,即请求参数的乱码问题

  原因:
  Tomcat官方文档中The HTTP Connector的配置,其中对URIEncoding属性的描述:
  This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

  翻译:如果没有指定,将使用ISO-8859-1解码URI。

  解决方法,有两种:
  1 根本方法:修改server.xml文件

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />

  2 局部方法:得到一次参数,解码,再编码

String name=request.getParameter(parameter);
byte[] arr=name.getBytes("ISO8859-1");
String nameAfterTransfer=new String(arr,"UTF-8");

  2 post方式,即请求体的乱码问题

  原因:如果没有设置Request,则使用"ISO-8859-1"解码,和你提交页面的编码方式无关。

  解决方法:
  Tomcat官方文档中Container Provided Filters的配置,系统提供了一些Filter。其中一个是,org.apache.catalina.filters.SetCharacterEncodingFilter,顾名思义,是设置编码的过滤器。其中有两个属性,encoding,要设置编码的名字,另一个是,ignore,确定是否忽略了由用户代理指定的任何字符编码。如果此属性是true的,则忽略了用户代 
理,即浏览器提供的任何值。如果false,只有当用户代理没有指定一个编码时,编码才被设置。默认值是false的。

<filter>
  <filter-name>SetCharacterEncodingFilter</filter-name>
  <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>自己设置的编码</param-value>
  </init-param>
  <init-param>
    <param-name>ignore</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SetCharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

  SetCharacterEncodingFilter类的中的实现,就是设置request.setCharacterEncoding(上面配置中的参数);

  结论:
  我们平时request.setCharacterEncoding("UTF-8")的设置,只是改变请求体的编码方式。

  3 get和post编码问题一起解决的方式:使用useBodyEncodingForURI属性。

  useBodyEncodingForURI,如果该值是true,将使用请求体的编码方式编码URI。

  Tomcat官方文档对useBodyEncodingForURI属性是这么解释的,

  如果请求的字符编码是不知道的(不是由浏览器提供,不由setcharacterencodingfilter或使用request.setcharacterencoding方法类似的过滤器),默认的编码是“ISO-8859-1”。而URIEncoding设置对此无影响。

  4 您猜测以下结果会乱码吗?

  在如下html页面中进行操作,该页面已经进行了UTF-8编码,POST提交到后台:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>测试</title>
</head>
<body>
<div>
  <form action="http://localhost/Web/B" method="post">//B是我使用的Servlet类。
    <input type="text" name="name" value="大"/>
    <input type="submit" value="提交表单"/>
  </form>
</div>
</body>
</html>

  答案是:乱码,您答对了吗?
  结论:
    1 Tomcat不会理会我们所提交页面的编码方式,或者说请求中根本不含有编码方式。
  2 如果没有进行request.setCharacterEncoding("UTF-8")设置或者添加过滤器,Tomcat还是会使用"ISO-8859-1"解码。
  3 所以不论提交前页面的编码格式是什么,我们都要设置自己的编码方式。

  终极解决方案
  假设我们要全部使用UTF-8进行解码,终极解决方案就是,
  1 设置server.xml中,useBodyEncodingForURI="true"
  2 设置request.setCharacterEncoding("UTF-8");//本质添加过滤器也就是这么处理的,故没有说添加过滤器。

  就这样,我们就达到了get与post请求全部UTF-8解码的效果。

  最后,如果里面有不对的地方,欢迎大家对我的总结进行指正。

                                                        

Servlet-中文乱码的更多相关文章

  1. jsp+servlet中文乱码问题

    jsp+servlet中文乱码问题 servlet想要获得前台传来的值 String strName=new String(request.getParameter("name") ...

  2. Servlet 中文乱码问题解析及详细解决方法

    使用 servlet 向客户端浏览器回送中文时,经常出现中文乱码的问题,这里给大家完完全全地搞明白: 一.基本常识 中文系统默认是 GBK 编码(GBK是对GB2312的补充,包含它) 需要处理编码问 ...

  3. jsp和servlet中文乱码

    jsp和servlet之间出现中文乱码的集中原因和解决方法详解:http://blog.csdn.net/longyuhome/article/details/7856270

  4. [转]Servlet 中文乱码问题及解决方案剖析

    原文地址:http://blog.csdn.net/xiazdong/article/details/7217022/ 一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过G ...

  5. Servlet 中文乱码问题及解决方案剖析

    转自:http://blog.csdn.net/xiazdong/article/details/7217022/ 一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK ...

  6. Servlet中文乱码问题解决办法

    首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 ...

  7. jsp中文乱码 Servlet中文乱码 utf-8

    JSP+Servlet项目中,项目统一使用utf-8编码.配置过滤器过滤所以请求并设置utf-8编码,jsp页面也都设置utf-8,但是还有一点很容易忽视的就是tomcat也要设置utf-8,默认情况 ...

  8. servlet中文乱码问题

    通过response对象向页面输出内容时遇到的乱码问题可分为两种情况 1.字节流 字节流输出时可以通过设置响应头"Content-Type"的值为"text/html;c ...

  9. Servlet中文乱码解决方法

    程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件. 字节流和字符流的区别: 在Java.io包中操作文件内容的主要有两大类:字节流.字符流,两类都分为输入和输出操作. 在字节流中输 ...

  10. Servlet中文乱码原因 解决 Get 和 Post 和客户端

    一.Get方式的中文乱码 1) 使用如下页面表单内容: <form action="http://127.0.0.1:8080/day07/params" method=&q ...

随机推荐

  1. 基于Multisim的buck降压斩波电路仿真

    和boost电路相反,buck电路为DC-DC降压电路,搞了一下仿真发现低压情况下降压效率比較高,电压略微高一点降压效率就不敢恭维了. .不知道是怎么回事 仿真电路: 占空比D设置了0.5, U0=U ...

  2. Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法

    Spring3系列10- Spring AOP——Pointcut,Advisor 上一篇的Spring AOP Advice例子中,Class(CustomerService)中的全部method都 ...

  3. iOS方法类:CGAffineTransform的使用大概

    CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平移操作: 另称放射变换矩阵,可参照线性代数的矩阵实现方式0. ...

  4. 用 Wireshark 图解:TCP 三次握手

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “snow warn throughout the winter” 一.什么是 Wireshar ...

  5. dos下mysql登陆

    dos下先进入mysql的bin目录 然后执行:mysql -r root -p123456(注意123456是密码) 进去之后:首先要这样:use test;//代表你目前要使用的是test这个数据 ...

  6. DiskGenius无损调整分区大小

    一般情况下,调整分区的大小,通常都涉及到两个或两个以上的分区.比如,要想将某分区的大小扩大,通常还要同时将另一个分区的大小缩小:要想将某个分区的大小缩小,则通常还要同时将另一个分区的大小扩大.    ...

  7. yii2 [行为] behaviors 拦截器

    yii2 拦截器 在控制器中可以自定义对action的拦截器,拦截器需要继承 \yii\base\ActionFilter 参考代码: class BaseUserAuthorizeFilter ex ...

  8. Android使用SurfaceView实现墨迹天气的风车效果

    SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...

  9. 移动审批App开发总结

    公司新需求要在手机上进行审批. 现在开发完成了. 总结:1.初步把公司的工作流模块做成RPC服务,公共服务可以进行调用. 2.服务分层,每个App的页面对应一个服务端的接口,作为前端控制器,用来从更低 ...

  10. 爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码)

    实现从Web网页提取文本之前,首先要识别网页的编码,有时候还需要进一步识别网页所使用的语言.因为同一种编码可能对应多种语言,例如UTF-8编码可能对应英文或中文等语言. 识别编码整体流程如下: (1) ...