Java Web乱码分析及解决方式(二)——POST请求乱码
引言
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请求乱码的更多相关文章
- Java Web乱码分析及解决方式(一)——GET请求乱码
引言: 在进行Web開始时.乱码是我们最常常遇到也是最主要的问题.有经验的程序员非常easy能解决,刚開始学习的人则easy被泥潭困住. 并且非常多时候.我们即使攻克了乱码问题也是不明就里.往 ...
- Android ListView异步载入图片乱序问题,原因分析及解决方式
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android全部系统自带的控件其中,ListView这个控件算是 ...
- .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax
.atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax 1. 原理实现 1 2. Page 添加配置.添加回调函数dwr.engine.setActiveRev ...
- 分享下今天研究的流量上限DDos攻击分析和解决方式
分享下今天研究的流量上限DDos攻击分析和解决方式 常常听到或者碰到某个站点被攻击.一般都是流量攻击.今天自己写了个程序測下相关的上限,程序仅仅简单做了个get html操作(不包括图片等资源文件). ...
- angular分页插件tm.pagination 解决触发二次请求的问题
angular分页插件tm.pagination(解决触发二次请求的问题) DEMO: http://jqvue.com/demo/tm.pagination/index.html#?current ...
- request、response 中文乱码问题与解决方式
request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...
- Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)
补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...
- Linux转发性能评估与优化(转发瓶颈分析与解决方式)
线速问题 非常多人对这个线速概念存在误解. 觉得所谓线速能力就是路由器/交换机就像一根网线一样. 而这,是不可能的.应该考虑到的一个概念就是延迟. 数据包进入路由器或者交换机,存在一个核心延迟操作,这 ...
- 在Tomcat中部署Java Web应用程序几种方式
在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署 静态部署指的是我们在服务器启动之前部 ...
随机推荐
- ActiveMQ学习笔记(14)----Destination高级特性(二)
1. Visual Destinations 1.1 概述 虚拟Destination用来创建逻辑Destinations,客户端可以通过它来产生和消费消息,它会把消息映射到物理Destination ...
- SpringCloud学习笔记(11)----Spring Cloud Netflix之Hystrix断路器的使用
为什么会有断路器? 在微服务架构中,系 是拆分成 一个的服务单元各间通过注册与发现 的方式互相依 赖.每个单元都在不同的进程中运行, 都是通过远程调用的方式进行信 ,这样就有可能因为网络原或 是依赖服 ...
- 比较好的Dapper封装的仓储实现类 来源:https://www.cnblogs.com/liuchang/articles/4220671.html
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...
- 搭健MyBatis开发环境
相关文献资料地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html 关于如何创建一个项目,添加Tomcat运行环境和生成`web.xml ...
- BZOJ 2555: SubString 后缀自动机_LCT
很水的一道题,就是有些细节没注意到. 比如说将调试信息误以为是最终结果而多调了20分钟QAQ ..... 我们注意到,每新加一个节点,改变的是该节点沿着 Parent 走一直走到根节点. 对应的,在 ...
- Linux停止tomcat运行
打开终端cd /java/tomcat#执行bin/startup.sh #启动tomcatbin/shutdown.sh #停止tomcattail -f logs/catalina.out #看t ...
- 由Request Method:OPTIONS初窥CORS(转)
刚接触前端的时候,以为HTTP的Request Method只有GET与POST两种,后来才了解到,原来还有HEAD.PUT.DELETE.OPTIONS…… 目前的工作中,HEAD.PUT.DELE ...
- LightOJ-1220 Mysterious Bacteria 唯一分解定理 带条件的最大公因数
题目链接:https://cn.vjudge.net/problem/LightOJ-1220 题意 给x=y^p,问p最大多少 注意x可能负数 思路 唯一分解定理,求各素因数指数的GCD 注意负数的 ...
- springMVC 定时器配置
1.在springMVC中加入 xmlns:task="http://www.springframework.org/schema/task" http://www.springf ...
- centeros 7开机自动挂载磁盘
场景: 使用mount命令将新发现的磁盘/dev/sdb挂载给/liu后,但是重启后又看不到磁盘? 问题导致原因: 虽然我们可以使用mount命令去挂载磁盘,但是此操作只对服务器运行期间有效,也就是临 ...