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

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. robotframework接口测试(一)—Get request json

    (前提:引入了 requests.requestsLibrary等相关库,这样才可以只有相关的关键字.) 理想中的过程: 1. 创建session 2. 在该session下发起请求 3. 验证返回结 ...

  2. PAT A1076 Forwards on Weibo (30 分)——图的bfs

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  3. mysql5.6.8源码安装

    内核: [root@opop ~]# cat /etc/centos-release CentOS release 6.8 (Final)[root@opop ~]# uname -aLinux op ...

  4. MySQL 基础四 存储过程

    -- 定义存储过程 DELIMITER // CREATE PROCEDURE query_student2() BEGIN SELECT * FROM student; END // DELIMIT ...

  5. linux gcc nginx

    1.安装GCC[root@rekfan.com opt]# rpm -ivh cpp-4.1.2-48.el5.i386.rpm[root@rekfan.com opt]# rpm -ivh kern ...

  6. node 命令行升级版本

    node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 1. 首先安装n模块: npm install -g n 2. 升级node.js到最新稳定版 n stable ...

  7. you-get帮助使用手册

    you-get使用手册 可选参数:   -V, --version          查看版本并退出   -h, --help             查看帮助信息 不影响使用的选项:   -i, - ...

  8. Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并

    传送门 弱化版 考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树.那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量. 因为没有 ...

  9. CF28D Don't fear, DravDe is kind 背包

    题目传送门:http://codeforces.com/problemset/problem/28/D 题意:给你$N$个物品,每个物品有其价格$P_i$,之前必须要买的物品价格和$L_i$,之后必须 ...

  10. 阿里云ubuntu 16.04搭建odoo11服务器

    ubuntu 16.04 具体如何搭建odoo11网站的具体步骤可以参考这一篇文章 按上面的文章配置环境后,自己网站的启动具体步骤如下: 1.登录阿里云 [远程连接],进入命令行界面1 2.cd到目录 ...