Java Web中涉及的编解码

用户从浏览器发起一个HTTP请求,存在编码的地方是URL、Cookie、Paramiter。服务器端接收到HTTP请求后要解析HTTP协议,其中URL、Cookie和POST表单参数要解码,服务器端可能还需要读取硬盘数据(数据库、文件),这些数据都可能存在编码问题。当Servlet处理完所有请求的数据后,需要将这些数据再编码通过Socket发送到用户请求的浏览器里,再经过浏览器解码成为文本。这些过程用图表示如下:

1.URL的编解码

为了验证浏览器是怎么编码URL的,我们选择FireFox浏览器并通过HTTPFox插件观察请求的URL的实际内容:

从结果上看,PathInfo是UTF-8编码,而QueryString是GBK编码。至于为什么有%,是由URL的编码规范FRC3986规定:浏览器编码URL将非ASCII字符按照某种编码格式编码成16进制数字后将每个16进制表示的字节前加上“%”。

从上面的测试结果可知,浏览器对PathInfo和QueryString的编码是不一样的,不同的浏览器对PathInfo的编码也可能不一样。如Chrome会对请求“http://localhost:8080/中国?中国”转变为“http://localhost:8080/%E4%B8%AD%E5%9B%BD?%E4%B8%AD%E5%9B%BD”,这里PathInfo和QueryString的编码是一样的,都是UTF-8编码。

2.HTTP Header的编解码

当客户端发起一个HTTP请求时,除了上面的URL外还可能会在Header中传递其他的参数,如Cookie、redirectPath等,这些用户设置的值很可能也会存在编码问题。

在Tomcat中,对Header中的项进行解码是在调用request.getHeader时进行的,如果请求的Header项没有解码则调用MessageBytes的toString方法,这个方法将从byte从char的转化使用的默认编码是ISO-8859-1,而我们也不能设置Header的其他解码格式,所以如果你设置的Header中非ASCII字符解码肯定会有乱码。

我们在添加Header时也是同样的道理,不要在Header中传递非ASCII字符,如果一定要传递可以先将字符用org.apache.catalina.util.URLEncoder编码,然后再添加到Header中,这样在浏览器到服务器的传递中就不会丢失信息了,我们在访问这些项时再按照相应的字符集解码就好了。

3.POST表单的编解码

POST表单参数传递方式与QueryString不同,它是通过HTTP的BODY传递到服务端的。当我们在页面上点击提交按钮时浏览器首先将根据页面的ContentType的Charset编码格式对表单填的参数进行编码,然后提交到服务器端。在服务器端同样也是用ContentType中的字符集进行解码。所以通过POST表单提交的参数一般不会出现问题,而且这个字符集编码是我们自己设置的。

另外,针对multipart/form-data类型的参数,也就是上传的文件编码,同样也使用ContentType定义的字符集编码。值得注意的地方是,上传文件是用字节流的方式传输到服务器的本地临时目录,这个过程并没有涉及字符编码,而真正编码是在将文件内容添加到parameters中时,如果用这个不能编码将会用默认编码ISO-8859-1来编码。

4.HTTP BODY的编解码

当用户请求的资源服务端已经成功获取后,这些内容将通过Response返回给客户端浏览器,这个过程先要经过编码再到浏览器进行解码,浏览器根据HTML的<meta HTTP-equiv=“Content-Type” content=”text/html; charset=GBK”>中的charset来解码。如果没有定义,那么浏览器将会使用默认的编码来解码。

访问数据库都是通过客户端JDBC驱动来完成的,用JDBC来存取数据要和数据的内置编码保持一致,可以通过设置JDBC URL来指定。

5.JS中的编解码

html文件本身中的js的编码和当前页面中的Content-Type保持一致。

对于采用<script src=”script.js”/>类型引入的js文件,浏览器就会以当前这个页面的默认字符集解析这个JS文件,如果外部的JS文件的编码格式与当前页面的编码格式一致,那么可以不设置这个charset。但是如果script.js文件的编码格式与当前页面的不一致,就必须要指定对应的字符集,要不然对于非ASCII字符就会出现乱码。

6.其他需要编码的地方

除了URL和参数编码问题外,在服务端还有很多地方可能存在编码,如可能需要读取XML、Velocity模板引擎、JSP或者从数据库读取数据等。

参考资料:《深入分析Java Web技术》

Java Web中涉及的编解码

时间: 2024-10-16 05:20:13

Java Web中涉及的编解码的相关文章

CKEditor4 在java web中的应用说明(详细可行)

按照官方的说明书就可,这里主要注意一点!! 就是<script src="../ckeditor.js"></script>中js文件的路径问题,我的ckeditor文件夹是在WebContent文件夹下,jsp文件是同一层目录的,所以最后的代码应该是 <script type="text/javascript"src="./ckeditor/ckeditor.js"></script> 注意斜杆号

java web中servlet、jsp、html 互相访问的路径问题。

在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendRedirect(path); 情况二.指向内部的web组件和本身有关系的,这一类我暂时看到的有:servlet或者jsp的转发 假设在myapp项目下有

java web 中的转发和重定向

假设应用程序的 contextPath 为 /ctx,在 http://localhost:8080/ctx/a/b 资源中,我们转发和重定向到 http://localhost:8080/ctx/x/y 资源,分别应该怎么写? 转发,是在同一个应用程序中,请求从由资源 A 处理,到由资源 B 处理.资源 A 和资源 B 属于同一个应用程序的资源,它们总是相对于该应用程序的 contextPath 而言的.转发的资源可以使用相对路径(不以 "/" 开头)和绝对路径(以 "/&

jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)

一 简介和实现效果 这里用一个小例子来简单举例说明,做一个搜索引擎搜索提示效果,通过不断输入字符,然后在下方给出搜索提示.效果图如下: 通过上图可以看到,当输入一个"a"时,提示了很多内容,然后继续输入一个"e"后,提示的范围明显就变小了. 注:在文末我会给出完整源代码的下载链接,以供大家参考 二 具体实现 1 在eclipse for java ee中创建一个Java Web工程,然后导入相应的jar包,特别说明的是:这里要导入一个额外的dwr.jar.也就是说,

Java web中常见编码乱码问题(二)

根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集. System.out.println(System.getProperty("file.encoding")); a1.如果是不支持中文的就要设置jvm编码了,设置方法: Windows环境就在catalina.bat配置: s

java web中路径问题。

转自:http://blog.csdn.net/liang5630/article/details/38474543 如有侵权,请及时联系本人及时删除 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendR

Java Web中的中文编码

Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则了. 1 常见的编码方式 计算机中提供了多种编码方式,常见的有ASCII.ISO-8859-1.GBK.GB2312.UTF-16.UTF-8等. ASCII 码 学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等:32~126

深入分析Java Web中的中文编码问题

要对Java Web项目进行编码原因: 1.在计算机中存储信息的最小单位是1个字节,即8个bit,所以能表示的字符范围是0~255个. 2.电脑需要表示的符号太多.无法用1个字节完全表示. 要解决这个问题,必须要有一个新的数据结构char,而从bit到char就要进行编码. 常见的编码格式: 1.ASCII码 总共128个,用1个字符的低7位表示,0~31是控制字符,如换行.回车.删除等.32~126是打印字符,可以通过键盘输入并且表示出来 2.ISO-8859-1 ISO组织在ASCII的基础

java web中请求和响应中包含中文出现乱码解析

说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码.而字符编码有多种不同的编码表,所以,如果编码格式和解码格式不是同一个码表就会出现乱码.想要避免出现乱码,需要使保存和读取时使用相同的码表. 在java web编程中经常会出现乱码,现在详细讲解一下如何进行设置,避免乱码 1 网页编码 在编写网页的时候,需要指定网页的编码格式,使用<meta http-equiv=&quo