文档章节

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

 烟中泪
发布于 2017/05/05 11:18
字数 994
阅读 3
收藏 0

之所以出现乱码,主要是由于编码和解码采用的方法不同。

因此保证编码解码格式一致是避免乱码发生的重要前提。

 

问题背景:JavaWeb技术下,Tomcat作为容器,发送请求的时候出现乱码问题。

 

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

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的)

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

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

 

publicclass EncodingFilter extends HttpFilter {  
  
    publicvoid doFilter(HttpServletRequest request,  HttpServletResponse response, FilterChain cha
       in) throws IOException, ServletException {  
  
       Stringcharset = this.getInitParameter("charset");  
  
       if(charset == null ||charset.isEmpty()) {  
  
           charset ="UTF-8";  
  
       }  
  
        request.setCharacterEncoding(charset);  
  
       response.setContentType("text/html;charset=" + charset);  
  
       chain.doFilter(request, response);  
  
    }  
}  

 

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

public class EncodingRequest extends HttpServletRequestWrapper {  
    private String charset;  
    public EncodingRequest(HttpServletRequest request, String charset) {  
        super(request);  
        this.charset = charset;  
    }  
  
    public String getParameter(String name) {  
        HttpServletRequest request = (HttpServletRequest) getRequest();  
          
        String method = request.getMethod();  
        if(method.equalsIgnoreCase("post")) {  
            try {  
                request.setCharacterEncoding(charset);  
            } catch (UnsupportedEncodingException e) {}  
        } else if(method.equalsIgnoreCase("get")) {  
            String value = request.getParameter(name);  
            try {  
                value = new String(name.getBytes("ISO-8859-1"), charset);  
            } catch (UnsupportedEncodingException e) {  
            }  
            return value;  
        }  
        return request.getParameter(name);  
    }  
}  

EncodingFilter.java

public class EncodingFilter extends HttpFilter {  
    public void doFilter(HttpServletRequest request,  
            HttpServletResponse response, FilterChain chain)  
            throws IOException, ServletException {  
        String charset = this.getInitParameter("charset");  
        if(charset == null || charset.isEmpty()) {  
            charset = "UTF-8";  
        }  
        response.setCharacterEncoding(charset);  
        response.setContentType("text/html;charset=" + charset);  
        EncodingRequest res = new EncodingRequest(request, charset);  
        chain.doFilter(res, response);  
    }  
}  

web.xml

<filter>  
    <filter-name>EncodingFilter</filter-name>  
    <filter-class>cn.itcast.filter.EncodingFilter</filter-class>  
    <init-param>  
        <param-name>charset</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>EncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  


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

本文转载自:http://blog.csdn.net/u014424628/article/details/48255263

上一篇: 初次体验java
下一篇: 数据库简介
粉丝 0
博文 25
码字总数 8535
作品 0
私信 提问
表单传输后台乱码是什么原因?表单数据获取方法中get/post区别解析

在JSP传输数据时,不管是表单传输或者ajax操作,它们的method或者type都是get或者post,并且它们的默认传输编码为”ISO8859-1”.  1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议...

xc121566的博客
2017/12/11
0
0
java web中的中文乱码问题——浏览器与服务器之间的中文乱码

一. 乱码产生原因 浏览器在向服务器发送请求时会对携带的请求参数进行编码(UTF-8格式),服务器在接收到请求参数时会对其进行解码,由于浏览器与服务器编码格式不同产生乱码。不同服务器默认...

littleant2
2015/08/30
226
0
day10 Request&Response

service(request,response)工作原理: Response: 响应行:响应的协议 响应的状态码 响应的描述 响应头 响应正文 状态码,字节流,字符流: 注意:设置错误的要用:sendError() 重定向: 乱码:...

萧小蚁
2016/03/13
56
0
JSP乱码常用解决办法

一、表单提交时出现乱码: 在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式。所以请求的时候便有get请求和pos...

流金岁月2015
2016/10/08
22
0
一次post提交中文造成乱码问题的分析

前提条件 在解决问题之前,web模块中配置了自定义的HttpEncodingFilter和GetHttpServletRequestWrapper,期待能够解决所有服务器上的中文乱码问题,很遗憾,让大家失望了。最后给出web.xml中...

彭苏云
2015/09/18
3.9K
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 年迈渔夫遭黑帮袭抢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享Elvis Presley的单曲《White Christmas》: 《White Christmas》- Elvis Presley 手机党少年们想听歌,请使劲...

小小编辑
今天
1K
20
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
16
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部