下面以两种常见的请求方式为例讲解乱码问题的解决方法。

1.Post方式请求乱码。

自从Tomcat5.x以来,Get方式和Post方式提交的请求,tomcat会采用不同的方式来处理编码。

对于Post请求,Tomcat会使用request.setCharacterEncoding和response.setCharacterEncoding方法设置的编码格式进行处理。

如果未设置,则默认都采用iso-8859-1编码。因此如果在发送Post请求的时候出现乱码,常见的解决方法如下:

a)  request.setCharacterEncoding("utf-8");

b)  String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"); 
(当然response的编码也不要忘记设置成utf-8的)

【注】:上面提供的是两种不同的方法,并不是一种方法的两个步骤!!!

我们可以看出来第一种方式写法固定,非常很适合通过写成过滤器的方式进行编码的统一转换。

  1.  
    publicclass EncodingFilter extends HttpFilter {
  2.  
     
  3.  
    publicvoid doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
  4.  
     
  5.  
    Stringcharset = this.getInitParameter("charset");
  6.  
     
  7.  
    if(charset == null ||charset.isEmpty()) {
  8.  
     
  9.  
    charset ="UTF-8";
  10.  
     
  11.  
    }
  12.  
     
  13.  
    request.setCharacterEncoding(charset);
  14.  
     
  15.  
    response.setContentType("text/html;charset=" + charset);
  16.  
     
  17.  
    chain.doFilter(request, response);
  18.  
     
  19.  
    }
  20.  
    }

2.Get方式请求乱码

我们刚谈到Tomcat对Post请求的编码处理策略,并且从字里行间读出了Tomcat对Post和Get的编码策略有所不同,

那么Tomcat对Get请求的编码策略到底是如何不同的呢?答案就是Tomcat对于Get请求并不会考虑使用request.setCharacterEncoding方法设置的编码

言外之意就是我们无法通过request.setCharacterEncoding方式来改变编码,因为最终Tomcat会永远使用iso-8859-1进行编码(但是要注意一下,

respon还是可以通过调用response.setCharacterEncoding方式进行编码的设置的),既然是这样的话下面这个方法还是勉强可行的

a)

步骤一:response.setCharacterEncoding("UTF-8")

步骤二:String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");

通过这两步,可以看到我们的request的字符编码格式是默认的“iso-8859-1" 我们的response字符编码是自己设置的”utf-8"

显然两个是不相容的,因此我们在获取请求参数的时候才进行了一下字符集的转换即步骤二:

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");

既然有a),那肯定还有b)咯?当然!而且方案b更加干净,利落,彻底。让我们一起看一下吧:

b)

修改Tomcat安装目录下conf子目录下的server.xml文件(解决get方式) 【注:记得先停掉服务器】

找到文件中类似这样的段落:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

在里面加上这样一段:URIEncoding="UTF-8" 即变成下面这段
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />

最后重启Tomcat即可。

对于Get请求编码的统一处理也可以写成过滤器的形式,只不过稍微有些复杂。

EncodingRequest.java

  1.  
    public class EncodingRequest extends HttpServletRequestWrapper {
  2.  
    private String charset;
  3.  
    public EncodingRequest(HttpServletRequest request, String charset) {
  4.  
    super(request);
  5.  
    this.charset = charset;
  6.  
    }
  7.  
     
  8.  
    public String getParameter(String name) {
  9.  
    HttpServletRequest request = (HttpServletRequest) getRequest();
  10.  
     
  11.  
    String method = request.getMethod();
  12.  
    if(method.equalsIgnoreCase("post")) {
  13.  
    try {
  14.  
    request.setCharacterEncoding(charset);
  15.  
    } catch (UnsupportedEncodingException e) {}
  16.  
    } else if(method.equalsIgnoreCase("get")) {
  17.  
    String value = request.getParameter(name);
  18.  
    try {
  19.  
    value = new String(name.getBytes("ISO-8859-1"), charset);
  20.  
    } catch (UnsupportedEncodingException e) {
  21.  
    }
  22.  
    return value;
  23.  
    }
  24.  
    return request.getParameter(name);
  25.  
    }
  26.  
    }

EncodingFilter.java

  1.  
    public class EncodingFilter extends HttpFilter {
  2.  
    public void doFilter(HttpServletRequest request,
  3.  
    HttpServletResponse response, FilterChain chain)
  4.  
    throws IOException, ServletException {
  5.  
    String charset = this.getInitParameter("charset");
  6.  
    if(charset == null || charset.isEmpty()) {
  7.  
    charset = "UTF-8";
  8.  
    }
  9.  
    response.setCharacterEncoding(charset);
  10.  
    response.setContentType("text/html;charset=" + charset);
  11.  
    EncodingRequest res = new EncodingRequest(request, charset);
  12.  
    chain.doFilter(res, response);
  13.  
    }
  14.  
    }

web.xml

  1.  
    <filter>
  2.  
    <filter-name>EncodingFilter</filter-name>
  3.  
    <filter-class>cn.itcast.filter.EncodingFilter</filter-class>
  4.  
    <init-param>
  5.  
    <param-name>charset</param-name>
  6.  
    <param-value>UTF-8</param-value>
  7.  
    </init-param>
  8.  
    </filter>
  9.  
    <filter-mapping>
  10.  
    <filter-name>EncodingFilter</filter-name>
  11.  
    <url-pattern>/*</url-pattern>
  12.  
    </filter-mapping>

【注】为了避免您的测试与我给的解决方案结果不符,请在项目编码格式为utf-8,jsp页面 pageEncoding="utf-8"的环境下测试。

参考:Get请求,Post请求乱码问题解决方案

Get请求,Post请求乱码问题解决方案的更多相关文章

  1. java web项目get,post请求参数中文乱码解决

    [转载]原文地址:https://www.cnblogs.com/tom-plus/p/6392279.html 在开发过程中,有时候会碰到get,post请求参数中文乱码. 原因: Http请求传输 ...

  2. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  3. [转]解决GET请求时中文乱码的问题

    原文地址:http://www.cnblogs.com/liukemng/p/4178882.html 之前项目中的web.xml中的编码设置: <filter> <filter-n ...

  4. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表

    本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...

  5. JSP中解决获取请求参数中文乱码问题

    分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...

  6. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)

    前述:      在写这篇笔记之前,对笔记中的设计模式进行介绍:      本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式           (1)装饰(包装)设计模式口诀:         ...

  7. 详解get请求和post请求参数中文乱码的解决办法

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  8. post和get请求的参数乱码

    对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考 ...

  9. tomcat解决GET请求中文参数乱码

    通常,在使用Spring MVC框架的应用程序中,为了解决中文参数乱码的问题,都会添加如下过滤器配置: <filter> <filter-name>encodingFilter ...

随机推荐

  1. C# 语法三 抽象类和接口

    1.抽象类 2.接口 一 抽象类 跟普通类的区别: a)用abstract标识类.抽象方法 b)抽象方法,只能声明,不能定义 c)抽象类不能实例化 二 接口 接口用interface标识,所有的成员( ...

  2. LOJ540 游戏 构造

    传送门 题意:给出$N$,试构造一个点数小于$500$的图,使得其中三元环的个数恰好为$N$.$N \leq 2 \times 10^6$ 首先构造一个尽可能大的完全图,然后在这个完全图旁边加点.尽可 ...

  3. SpringBoot 异常处理

    异常处理最佳实践 根据我的工作经历来看,我主要遵循以下几点: 尽量不要在代码中写try...catch.finally把异常吃掉. 异常要尽量直观,防止被他人误解 将异常分为以下几类,业务异常,登录状 ...

  4. python 3.5下安装pycrypto

    pip install --use-wheel --no-index --find-links=https://github.com/sfbahr/PyCrypto-Wheels/raw/master ...

  5. LiveCharts文档-3开始-3类型和设置

    原文:LiveCharts文档-3开始-3类型和设置 LiveCharts文档-3开始-3类型和设置 类型和设置 这一部分非常的重要,涉及到LiveCharts的基本构成单元的介绍 LiveChart ...

  6. [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树

    这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...

  7. dotnetcore/CAP

    CAP带你轻松玩转Asp.Net Core消息队列 CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前 ...

  8. 免费的 Vue.js 入门与进阶视频教程

    这是我免费发布的高质量超清「Vue.js 入门与进阶视频教程」. 全网最好的.免费的 Vue.js 视频教程,课程基于 Vue.js 2.0,由浅入深,最后结合实际的项目进行了最棒的技术点讲解,此课程 ...

  9. VMware/KVM/OpenStack虚拟化之网络模式总结

    一.VMware虚拟机网络模式 Vmware虚拟机有三种网络模式:Bridged (桥接模式).NAT (网络地址转换模式).Host-Only (仅主机模式).下面分别总结下这三种网络模式: 1. ...

  10. VMware vSphere虚拟化-VMware ESXi 5.5组件安装过程记录

    几种主要的虚拟化 ESXi是VMware公司研发的虚拟机服务器,ESXi已经实现了与Virtual Appliance Marketplace的直接整合,使用户能够即刻下载并运行虚拟设备.这为 即插即 ...