引言

GET请求的本质表现是将请求參数放在URL地址栏中。form表单的Method为GET的情况。參数会被浏览器默认编码,所以乱码处理方案是一样的。

对于POST请求乱码。解决起来要比GET简单。我们关心的重点是在Request Body中。

请求乱码——Method方式

使用Method方式发送HTTP请求时,依据HTTP协议的规定,查询參数应该在Request的Body中。比如在Chrome下能够看到URL中不含有查询參数。

浏览器的编码

浏览器对POST的Request Body编码会採用页面指定的编码。这句话是我们听到最多也是众口相传的,可是究竟什么是“页面指定的编码”?这个问题就涉及到我们的响应乱码问题了。用句废话就是页面显示时採用的编码,通过浏览器右键能够看到的。可是假设页面乱码了,那么页面使用的编码就是Content-Type里面指定的编码,假设Content-Type没有指定,那么就是meta标签中指定的charset,这两个编码即影响了浏览器对Page页面的解码。又影响了POST请求对Request
Body的编码。

具体能够查看meta标签的http-equiv和Content-Type资料。

HTTP包传输的是字节码。不会传输字符。所以,无论是GET还是POST都须要编码。

使用Chrome观察Request的Http包时,我们会发现POST的数据被放在Form Date以下。而GET的数据放在Query String Parameters页签以下。在页面没有乱码情况下,中文參数都会被默认解码。

切换到View Source以下能够看到提交的编码參数。对于Request Body的长度,浏览器通过加入Content-Length报头来标记字节长度。

server的解码

Web容器对POST方法的解码受request.setCharacterEncoding方法的影响。

对于Tomcat容器,它的官方有这种说明:

How do I change how POST parameters areinterpreted?

POST requests should specify the encoding ofthe parameters and values they send. Since many clients fail to set an explicitencoding, the default is used (ISO-8859-1). In many cases this is not thepreferred
interpretation so one can employ a javax.servlet.Filter to setrequest encodings. Writing such a filter is trivial.

翻译过来就是:

对于POST请求,client应该明白的指明參数和值採用的编码类型。可是很多client并没有这么做。所以Tomcat会默认使用ISO-8859-1来解码POST的參数和值。

很多时候,我们能够使用一个Filter来设定Request的编码,写这么个Filter是微不足道的一件小事。

简单说就是Tomcat默认使用ISO-8859-1来解码POST的參数和值,能够使用Filter来设定Request Body的字符集。方法就是调用request的setCharsetEncoding。

文档中并没有说明client应该怎样明白说明POST请求的编码类型,可是我想可能是通过Http协议的标准报头:Accept-Charset来指定的吧。我们不是必需去做这个实验。由于我们的程序绝对不应该把这件事全然托管给“不靠谱”的client。

所以大多数情况下,我们会在getParameter方法前调用request的setCharacterEncoding方法。就像Tomcat文档中说的,用一个自己写的或者官方提供的Filter完毕这项工作就好了,Spring MVC提供的Filter也是简单的调用了这种方法:

Spring MVC 字符编码过滤器源代码:

@Override
protected void doFilterInternal(
HttpServletRequestrequest,HttpServletResponse response,FilterChain filterChain)
throws ServletException,IOException { if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding()== null)){
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}

出现乱码:

POST方法出现乱码时。首先确定下我们的页面使用的是哪种编码方案,然后调用request的setCharsetEncoding,一定要在getParameter前调用这种方法。

假设仍然是乱码通过这样一个小实验就能知道哪里出错了。

(1)先获取我们的乱码,String param = req.getParameter("xx");

(2)对param = new String(param.getBytes(“server编码”,“页面编码”))。

(3)server编码、页面编码要有“合理”的推測。页面编码通过浏览器菜单观察。别相信自己写的HTML标签。server编码能够试验ISO-8859-1和自己set的charset encoding。然后看看哪里和自己设计的不一致,问题自然就清楚了。



总结:

POST方式的乱码比GET处理要简单。我们不用关心URL的编码,也不用编码解码URL。

POST乱码。一般调用setCharsetEncoding就能够攻克了。可是要注意的是,POST的数据一样是经过编码、解码的。!仅仅只是是不用手动进行而已。

Java Web乱码分析及解决方式(二)——POST请求乱码的更多相关文章

  1. Java Web乱码分析及解决方式(一)——GET请求乱码

    引言:     在进行Web開始时.乱码是我们最常常遇到也是最主要的问题.有经验的程序员非常easy能解决,刚開始学习的人则easy被泥潭困住. 并且非常多时候.我们即使攻克了乱码问题也是不明就里.往 ...

  2. Android ListView异步载入图片乱序问题,原因分析及解决方式

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android全部系统自带的控件其中,ListView这个控件算是 ...

  3. .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax

    .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax 1. 原理实现 1 2. Page  添加配置.添加回调函数dwr.engine.setActiveRev ...

  4. 分享下今天研究的流量上限DDos攻击分析和解决方式

    分享下今天研究的流量上限DDos攻击分析和解决方式 常常听到或者碰到某个站点被攻击.一般都是流量攻击.今天自己写了个程序測下相关的上限,程序仅仅简单做了个get html操作(不包括图片等资源文件). ...

  5. angular分页插件tm.pagination 解决触发二次请求的问题

    angular分页插件tm.pagination(解决触发二次请求的问题) DEMO:  http://jqvue.com/demo/tm.pagination/index.html#?current ...

  6. request、response 中文乱码问题与解决方式

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码:   response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...

  7. Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)

    补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...

  8. Linux转发性能评估与优化(转发瓶颈分析与解决方式)

    线速问题 非常多人对这个线速概念存在误解. 觉得所谓线速能力就是路由器/交换机就像一根网线一样. 而这,是不可能的.应该考虑到的一个概念就是延迟. 数据包进入路由器或者交换机,存在一个核心延迟操作,这 ...

  9. 在Tomcat中部署Java Web应用程序几种方式

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署      静态部署指的是我们在服务器启动之前部 ...

随机推荐

  1. 如何防止js刷新页面后倒计时改变

    1.存入cookie或localstorage(清除浏览器缓存后时间依然改变) 2.存入数据库

  2. css实现步骤条

    实现效果 html <ul class="steps"> <li class="active">申请完成</li> < ...

  3. C语言的常用printf打印占位符%d, %u, %f, %s, %c, %o, %x

    占位符含义及用法 代码: #include <stdio.h> int main(int argc, char const *argv[]) { , b = -; // 默认10进制赋值 ...

  4. vue之父子组件间通信实例讲解(props、$ref、$emit)

       组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...

  5. 紫书 习题8-3 UVa 12545 (构造法)

    参考了https://blog.csdn.net/catglory/article/details/47188949 最后推出来操作的个数为问号的个数 加上 同一位置上S串为0而T串为1的位置数量 与 ...

  6. Tarjan 割点割边【模板】

    #include <algorithm> #include <cstring> #include <cstdio> using namespace std; +); ...

  7. 从头认识Spring-1.16 SpEl对集合的操作(1)-建立集合以及訪问集合的元素,以&lt;util:list/&gt;为例

    这一章节我们来讨论一下怎样建立集合以及訪问集合的元素? 1.建立集合? (1)domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch ...

  8. Linux/UNIX线程(1)

    线程(1) 本文将介绍怎样使用多个控制线程在单个进程环境中运行多个任务. 一个进程中的全部线程都能够訪问该进程的组成部件(如文件描写叙述符和内存). 线程包含了表示进程内运行环境必须的信息,当中包含进 ...

  9. thinkphp5的Illegal string offset 'id'错误

    thinkphp5的Illegal string offset 'id'错误 问题 解答 数组同名了,一个html页面传进来两个cateres的数组,所以在找id的时候不知道找这两个里面的哪一个 第一 ...

  10. POJ 3672 水题......

    5分钟写完 水水更开心 //By SiriusRen #include <cstdio> #include <iostream> #include <algorithm& ...