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报头来标记字节长度。

服务器的解码

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请求,客户端应该明确的指明参数和值采用的编码类型,但是许多客户端并没有这么做,所以Tomcat会默认使用ISO-8859-1来解码POST的参数和值。许多时候,我们可以使用一个Filter来设定Request的编码,写这么个Filter是微不足道的一件小事。

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

文档中并没有说明客户端应该如何明确说明POST请求的编码类型,但是我想可能是通过Http协议的标准报头:Accept-Charset来指定的吧。我们没必要去做这个实验,因为我们的程序绝对不应该把这件事完全托管给“不靠谱”的客户端。

所以大多数情况下,我们会在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(“服务器编码”,“页面编码”));

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

总结:

POST方式的乱码比GET处理要简单,我们不用关心URL的编码,也不用编码解码URL。POST乱码,一般调用setCharsetEncoding就可以解决了。但是要注意的是,POST的数据一样是经过编码、解码的!!只不过是不用手动进行而已。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 15:10:26

Java Web乱码分析及解决方案——POST请求的相关文章

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

引言:     在进行Web开始时,乱码是我们最经常遇到也是最基本的问题,有经验的程序猿很容易能解决,初学者则容易被泥潭困住.而且很多时候,我们即使解决了乱码问题也是不明就里,往往云里雾里. 其实乱码问题很简单,就是客户端和服务器使用了不一样的字符集导致的.也就是我们发送文件是用的字符编码和解析文件的编码不一致.所以只要搞清楚了我们的文件是怎么被编码和解码的解决乱码就很简单了.分析乱码,我们从请求乱码和响应乱码来分析,请求乱码又需要根据GET和POST来单独分析. 请求乱码--GET     请

Java Web乱码分析及解决方案

1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服务器上. 2.  URL编码规则. 每对name/value由&分开,每对来自表单的name/value用=分开.如果用户没有输入值的那个name依旧会出现不过就是没有值. URL编码是在字符ASCII码的十六进制数的前面加上%.例如\(她的十六进制数表示为5c)的URL编码就是%5c. 3.  简

Java Web乱码分析及解决方案(三)——响应乱码

响应乱码 请求乱码是客户端向服务器发送数据时,服务器解码错误.响应乱码则是服务器处理完请求后,输出到浏览器的数据被浏览器错误解码造成的显示乱码,这类乱码是最常见也是最直接的.造成这类乱码的情况最直接的一点就是服务器对Content-Type响应报文设置错误. 页面编码: 我们的页面一般来说,可能是通过下面两种方式生成的,也就是常说的静态页面和动态页面: (1)静态页面:我们用记事本或其他IDE工具编写的页面(比如.html),这些页面在编写的时候就需要指定一个字符编码,比如我们指定为ISO-88

Java ConcurrentModificationException 异常分析与解决方案

Java ConcurrentModificationException 异常分析与解决方案http://www.2cto.com/kf/201403/286536.html java.util.ConcurrentModificationException 解决办法 http://blog.csdn.net/lipei1220/article/details/9028669 原因:Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterato

java web 乱码 整理

众所周知 java 程序使用的是Unicode 编码字符集,是说java内存里面使用Unicode字符集操作文字,java内存外当然使用的是程序员自己制定的字符集,如果程序员没有指定字符集,那么会使用操作系统默认的字符集.linux 系统下面可以使用echo $LANG 查看系统默认的字符集,使用locale 查看系统支持的字符集. 经常遇到的几种乱码情况 终端看到的都是方框,说明没有没有安装中文字符集,yum install 安装简体中文和繁体中文 2.锟斤拷乱码, 3. 乱码, 4.????

Java Web 乱码

在做关于 Java Web 的项目中,有时候项目的整体设置为 utf-8 编码以后,你还是会发现项目还是乱码. 1.出现乱码实例 正如下图所示: 虽然在代码中,加入了:request.setCharacterEncoding("utf-8"); 结果还是会乱码. /** * 插入管理员 */ @WebServlet("/intsertinfo") public class IntsertAdmininfoServlet extends HttpServlet { p

java中文编码(字符集)分析-中文乱码分析及解决方案

 注:本文部分内容摘自网络,摘抄内容版权归原作者所有.  1.      背景知识 1.1.     Http协议 1.1.1.   URL和URI 1.1.2.   媒体类型定义 HTTP 在 Content-Type(14.17 节)和 Accept(14.1 节)头部域中使用因特网媒体类型 [17],为了提供打开和可扩展的数据类型和类型协议. media-type = type "/" subtype *( ";" parameter ) type = t

【转】Java ConcurrentModificationException 异常分析与解决方案--还不错

原文网址:http://www.2cto.com/kf/201403/286536.html 一.单线程 1. 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误的地方.先来看看都有哪些情况会出现ConcurrentModificationException异常,下面以ArrayList remove 操作进行举例: 使用的数据集合: ? 1 2 3 4 5 6 7 List<string> myList = new ArrayList<string>(); myList.

Java内存泄漏分析与解决方案

Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历与各位网友分享解决这些问题的办法. 作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.Ou