范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

requestgetparameter(一个WEB请求中涉及到的编解码)

  request getparameter(一个WEB请求中涉及到的编解码)Java Web 涉及到的编码
  用户从浏览器端发起一个 HTTP 请求,需要存在编码的地方是 URL、Cookie、Parameter。服务器端接受到 HTTP 请求后要解析 HTTP 协议,其中 URI、Cookie 和 POST 表单参数需要解码,服务器端可能还需要读取数据库中的数据,本地或网络中其它地方的文本文件,这些数据都可能存在编码问题,当 Servlet 处理完所有请求的数据后,需要将这些数据再编码通过 Socket 发送到用户请求的浏览器里,再经过浏览器解码成为文本。这些过程如下图所示:
  图 3. 一次 HTTP 请求的编码示例(查看大图)
  如上图所示一次 HTTP 请求设计到很多地方需要编解码,它们编解码的规则是什么?下面将会重点阐述一下:
  URL 的编解码
  用户提交一个 URL,这个 URL 中可能存在中文,因此需要编码,如何对这个 URL 进行编码?根据什么规则来编码?有如何来解码?如下图一个 URL:
  图 4.URL 的几个组成部分
  上图中以 Tomcat 作为 Servlet Engine 为例,它们分别对应到下面这些配置文件中:
  Port 对应在 Tomcat 的 <Connector port="8080"/> 中配置,而 Context Path 在 <Context path="/examples"/> 中配置,Servlet Path 在 Web 应用的 web.xml 中的<servlet-mapping>  <servlet-name>junshanExample</servlet-name>  <url-pattern>/servlets/servlet/*</url-pattern>  </servlet-mapping>
  <url-pattern> 中配置,PathInfo 是我们请求的具体的 Servlet,QueryString 是要传递的参数,注意这里是在浏览器里直接输入 URL 所以是通过 Get 方法请求的,如果是 POST 方法请求的话,QueryString 将通过表单方式提交到服务器端,这个将在后面再介绍。
  上图中 PathInfo 和 QueryString 出现了中文,当我们在浏览器中直接输入这个 URL 时,在浏览器端和服务端会如何编码和解析这个 URL 呢?为了验证浏览器是怎么编码 URL 的我们选择 FireFox 浏览器并通过 HTTPFox 插件观察我们请求的 URL 的实际的内容,以下是 URL:
  HTTP://localhost:8080/examples/servlets/servlet/ 君山 ?author= 君山在中文 FireFox3.6.12 的测试结果
  图 5. HTTPFox 的测试结果
  君山的编码结果分别是:e5 90 9b e5 b1 b1,be fd c9 bd,查阅上一届的编码可知,PathInfo 是 UTF-8 编码而 QueryString 是经过 GBK 编码,至于为什么会有"%"?查阅 URL 的编码规范 RFC3986 可知浏览器编码 URL 是将非 ASCII 字符按照某种编码格式编码成 16 进制数字然后将每个 16 进制表示的字节前加上"%",所以最终的 URL 就成了上图的格式了。
  默认情况下中文 IE 最终的编码结果也是一样的,不过 IE 浏览器可以修改 URL 的编码格式在选项 -> 高级 -> 国际里面的发送 UTF-8 URL 选项可以取消。
  从上面测试结果可知浏览器对 PathInfo 和 QueryString 的编码是不一样的,不同浏览器对 PathInfo 也可能不一样,这就对服务器的解码造成很大的困难,下面我们以 Tomcat 为例看一下,Tomcat 接受到这个 URL 是如何解码的。
  解析请求的 URL 是在
  org.apache.coyote.HTTP11.InternalInputBuffer 的 parseRequestLine 方法中,这个方法把传过来的 URL 的 byte[] 设置到 org.apache.coyote.Request 的相应的属性中。这里的 URL 仍然是 byte 格式,转成 char 是在org.apache.catalina.connector.CoyoteAdapter 的 convertURI 方法中完成的:1protectedvoidconvertURI(MessageBytesuri,Requestrequest)  2throwsException{  3ByteChunkbc=uri.getByteChunk();  4intlength=bc.getLength();  5CharChunkcc=uri.getCharChunk();  6cc.allocate(length,-1);  7Stringenc=connector.getURIEncoding();  8if(enc!=null){  9B2CConverterconv=request.getURIConverter();  10try{  11if(conv==null){  12conv=newB2CConverter(enc);  13request.setURIConverter(conv);  14}  15}catch(IOExceptione){...}  16if(conv!=null){  17try{  18conv.convert(bc,cc,cc.getBuffer().length-  19cc.getEnd());  20uri.setChars(cc.getBuffer(),cc.getStart(),  21cc.getLength());  22return;  23}catch(IOExceptione){...}  24}  25}  26//Defaultencoding:fastconversion  27byte[]bbuf=bc.getBuffer();  28char[]cbuf=cc.getBuffer();  29intstart=bc.getStart();  30for(inti=0;i<length;i++){  31cbuf[i]=(char)(bbuf[i+start]&0xff);  32}  33uri.setChars(cbuf,0,length);  34}
  从上面的代码中可以知道对 URL 的 URI 部分进行解码的字符集是在 connector 的 <Connector URIEncoding="UTF-8"/> 中定义的,如果没有定义,那么将以默认编码 ISO-8859-1 解析。所以如果有中文 URL 时最好把 URIEncoding 设置成 UTF-8 编码。
  QueryString 又如何解析? GET 方式 HTTP 请求的 QueryString 与 POST 方式 HTTP 请求的表单参数都是作为 Parameters 保存,都是通过 request.getParameter 获取参数值。对它们的解码是在 request.getParameter 方法第一次被调用时进行的。request.getParameter 方法被调用时将会调用
  org.apache.catalina.connector.Request 的 parseParameters 方法。这个方法将会对 GET 和 POST 方式传递的参数进行解码,但是它们的解码字符集有可能不一样。POST 表单的解码将在后面介绍,QueryString 的解码字符集是在哪定义的呢?它本身是通过 HTTP 的 Header 传到服务端的,并且也在 URL 中,是否和 URI 的解码字符集一样呢?从前面浏览器对 PathInfo 和 QueryString 的编码采取不同的编码格式不同可以猜测到解码字符集肯定也不会是一致的。的确是这样 QueryString 的解码字符集要么是 Header 中 ContentType 中定义的 Charset 要么就是默认的 ISO-8859-1,要使用 ContentType 中定义的编码就要设置 connector 的 <Connector URIEncoding="UTF-8" useBodyEncodingForURI="true"/> 中的 useBodyEncodingForURI 设置为 true。这个配置项的名字有点让人产生混淆,它并不是对整个 URI 都采用 BodyEncoding 进行解码而仅仅是对 QueryString 使用 BodyEncoding 解码,这一点还要特别注意。
  从上面的 URL 编码和解码过程来看,比较复杂,而且编码和解码并不是我们在应用程序中能完全控制的,所以在我们的应用程序中应该尽量避免在 URL 中使用非 ASCII 字符,不然很可能会碰到乱码问题,当然在我们的服务器端最好设置 <Connector/> 中的 URIEncoding 和 useBodyEncodingForURI 两个参数。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 中,这样在浏览器到服务器的传递过程中就不会丢失信息了,如果我们要访问这些项时再按照相应的字符集解码就好了。POST 表单的编解码
  在前面提到了 POST 表单提交的参数的解码是在第一次调用 request.getParameter 发生的,POST 表单参数传递方式与 QueryString 不同,它是通过 HTTP 的 BODY 传递到服务端的。当我们在页面上点击 submit 按钮时浏览器首先将根据 ContentType 的 Charset 编码格式对表单填的参数进行编码然后提交到服务器端,在服务器端同样也是用 ContentType 中字符集进行解码。所以通过 POST 表单提交的参数一般不会出现问题,而且这个字符集编码是我们自己设置的,可以通过
  request.setCharacterEncoding(charset) 来设置。
  另外针对 multipart/form-data 类型的参数,也就是上传的文件编码同样也是使用 ContentType 定义的字符集编码,值得注意的地方是上传文件是用字节流的方式传输到服务器的本地临时目录,这个过程并没有涉及到字符编码,而真正编码是在将文件内容添加到 parameters 中,如果用这个编码不能编码时将会用默认编码 ISO-8859-1 来编码。HTTP BODY 的编解码
  当用户请求的资源已经成功获取后,这些内容将通过 Response 返回给客户端浏览器,这个过程先要经过编码再到浏览器进行解码。这个过程的编解码字符集可以通过
  response.setCharacterEncoding 来设置,它将会覆盖request.getCharacterEncoding 的值,并且通过 Header 的 Content-Type 返回客户端,浏览器接受到返回的 socket 流时将通过 Content-Type 的 charset 来解码,如果返回的 HTTP Header 中 Content-Type 没有设置 charset,那么浏览器将根据 Html 的 <meta HTTP-equiv="Content-Type" content="text/html; charset=GBK" /> 中的 charset 来解码。如果也没有定义的话,那么浏览器将使用默认的编码来解码。其它需要编码的地方
  除了 URL 和参数编码问题外,在服务端还有很多地方可能存在编码,如可能需要读取 xml、velocity 模版引擎、JSP 或者从数据库读取数据等。
  xml 文件可以通过设置头来制定编码格式<?xmlversion="1.0"encoding="UTF-8"?>
  Velocity 模版设置编码格式:services.VelocityService.input.encoding=UTF-8
  JSP 设置编码格式:<%@pagecontentType="text/html;charset=UTF-8"%>
  访问数据库都是通过客户端 JDBC 驱动来完成,用 JDBC 来存取数据要和数据的内置编码保持一致,可以通过设置 JDBC URL 来制定如MySQL:url="jdbc:mysql://localhost:3306/DB?useUnicode=true&characterEncoding=GBK"

天下第一奇山(天下第一奇山黄山)天下第一奇山(天下第一奇山黄山)拥有天下第一奇山之称。五岳归来不看山,黄山归来不看岳我相信大家应该知道我今天介绍的是哪一个景点了吧?对了就是黄山,位于安徽省黄山市,原名黟山,唐朝时华西村龙希国际大酒店(天下第一村的地标建筑)华西村龙希国际大酒店(天下第一村的地标建筑)龙希国际大酒店(又名空中华西村)是位于江苏省无锡市江阴市的一座大型现代化酒店,由华西村委会投资,总投资超过30亿元。于2007年8月8日水空调原理(水系统空调的原理是什么?)水空调原理(水系统空调的原理是什么?)一空调水系统的主要内容1冷(热)水系统为空气处理设备提供冷(热)量。2冷却水系统为水冷式冷水机组的冷凝器提供冷却水。3冷凝水系统排放空气凝结水小梅沙旅游攻略(背仔角至小梅沙攻略)小梅沙旅游攻略(背仔角至小梅沙攻略)我们是从背仔角驿站下去的,走下长长的台阶就来到海边了。此时有两个方向可以走,向左是去灯塔,走到尽头后原路返回向右可以一直走回小梅沙栈道出口。我们浙江博物馆(浙江省博物馆十大镇馆之宝)浙江博物馆(浙江省博物馆十大镇馆之宝)浙江省博物馆浙江省博物馆位于杭州市西湖区,始建于1929年,原名浙江省立西湖博物馆,1976年更改为现名。2006年,浙江革命历史纪念馆归并浙岳不群怎么死的(为什么很多人认为岳不群是伪君子大反派坏到极致了?)岳不群怎么死的(为什么很多人认为岳不群是伪君子大反派坏到极致了?)岳不群最大的罪恶是,他出卖并伤害了书中所有信任他的人。被恶人伤害,我们想的是报复,被亲人伤害整本书里,最信任岳不群鸭形玻璃注(古墓出土的鸭形玻璃注)鸭形玻璃注(古墓出土的鸭形玻璃注)辽宁省博物馆有一件镇馆之宝叫鸭形玻璃注,因状如鸭嘴而得名。该器形长颈鼓腹,长尾细细,张扁嘴如鸭,只见它鸭嘴大张,颈部饰一周锯齿纹带,象征鸭颈的花羽泾渭分明是指同一条河流吗(此处和泾渭分明所指是同一条河流吗?)泾渭分明是指同一条河流吗(此处和泾渭分明所指是同一条河流吗?)姜子牙曾在渭水上钓鱼,此处和泾渭分明所指的是同一条河流吗?这是蚂蚁庄园11月2号今日庄园小课堂的问题,很多用户还不知道猴面包树(猴面包树会占领整个星球?)猴面包树(猴面包树会占领整个星球?)在安托万德圣埃克苏佩里所写的著名童话小说小王子中,描述了一颗独特的B612星球,它是毫不起眼的小行星,拥有唯一的居民小王子。而在这颗星球上也有植中国有多少丁克族(我国丁克一族超过60万)中国有多少丁克族(我国丁克一族超过60万)结婚生子,是中国人一贯的传统观念。这几年国家的二胎政策全面开放,但却并未达到预想的效果,因此甚至还有专家建议开放3胎。事实上,非但二胎政策俚语是什么意思(英语俚语Aok是什么意思?)俚语是什么意思(英语俚语Aok是什么意思?)哈喽大家好,这里是英语俚语节目。今天给大家带来两个非常地道涨姿势的俚语Aok和Nono,事不宜迟,我们一起来学习吧01Aok(e。oke
自攻螺丝(塑胶自攻螺丝支柱的设计)自攻螺丝(塑胶自攻螺丝支柱的设计)自攻螺丝支柱怎么设计?不是很简单吗?支柱内径螺丝公称直径0。8,支柱外径内径2。例如,M3的自攻螺丝,支柱内径2。4mm,支柱外径4。8mm。如果卡盘车床(车床卡盘扳手整体结构设计)卡盘车床(车床卡盘扳手整体结构设计)车床切削常用两副扳手一副是卡盘扳手,另一副是刀架扳手。两副扳手频繁使用,存在以下不足第一,卡盘扳手夹紧工件后,易忘记将其取下,当启动机床后,卡在电灯拉线开关(拉线开关怎么样?)电灯拉线开关(拉线开关怎么样?)拉绳式的开关是很早之前的一种开关方式,不过在现在基本上已经没有了,但是每次见到这样的都是一种回忆,那么拉绳式开关的工作原理是什么呢?拉绳式开关怎么样霍尔果斯口岸(自驾边境之旅,游霍尔果斯口岸)霍尔果斯口岸(自驾边境之旅,游霍尔果斯口岸)霍尔果斯口岸是新疆最大的陆路与铁路综合性口岸。位于中国新疆伊犁哈萨克自治州霍尔果斯市。与哈萨克斯坦隔霍尔果斯河相望。这里自隋唐时代起,就尖锐湿疣痒吗(是痔疮还是尖锐湿疣?)尖锐湿疣痒吗(是痔疮还是尖锐湿疣?)一位二十多岁的青少年来医院治疗尖锐湿疣,我带好防护措施,让他趴到治疗床脱掉裤子一看,才发现是痔疮不是尖锐湿疣,我告诉他是痔疮早期,他说,这几天上男性疾病(男科病就是性病?)男性疾病(男科病就是性病?)现实生活中很多男性对男科疾病存在一定的误解,觉得得了男科疾病就等于得了性病,是一件难以启齿的事,也会因为这种想法而不愿意去医院治疗。这其实是一种错误的想上海韩湘水博园(上海韩湘水博园,堪称古桥博物馆)上海韩湘水博园(上海韩湘水博园,堪称古桥博物馆)去上海韩湘水博园之前,我对水博园有个疑问,水博园,水的博览园,那是看什么的?看水?清澈的水?五彩的水?还是水利设施?去了之后才恍然大北斗七星的传说(北斗星只有七颗吗?)北斗七星的传说(北斗星只有七颗吗?)登封观星台如果有人跟你说北斗九星,你会有什么反应?你肯定会说为啥是北斗九星,应该是北斗七星吧?这是不是忽悠人的民科?然而,在河南巩义双槐树遗址荥玛雅论坛转载(玛雅文物展成都开幕!)玛雅论坛转载(玛雅文物展成都开幕!)今天上午(12月18日),由成都金沙遗址博物馆湖北省博物馆深圳博物馆洛杉矶郡艺术博物馆联合主办的玛雅的世界洛杉矶郡艺术博物馆藏古代玛雅艺术品特展文科生可以报考的专业(尤其适合文科生的5大职业)文科生可以报考的专业(尤其适合文科生的5大职业)孩子选择文科或者说新高考下选科文科的科目偏多未来怎么发展?大家要知道学生选择文科的话在志愿填报选专业的时候受到的限制还是很大的,而且鹤翔庄气功(谈谈我所练习过得鹤翔庄气功)鹤翔庄气功(谈谈我所练习过得鹤翔庄气功)我接触鹤翔庄气功在1990年吧,那时因我同学介绍,到邻村他大伯家,学习气功吧。他大伯姓李,是个气功武术爱好者,自练鹤翔庄,义务给附近村民教功