- 浏览: 1166984 次
- 性别:
- 来自: nibiru
-
文章分类
- 全部博客 (407)
- lucene (1)
- java (147)
- j2se (1)
- javascript (2)
- spring (5)
- hibernate (1)
- mysql (1)
- oracle (10)
- 工作 (10)
- JPA (13)
- 网站 (5)
- xml (2)
- mina (3)
- 思想 (16)
- httpclient (10)
- JFreeChart (1)
- 多线程 (0)
- swing (2)
- socket (0)
- 网络 (3)
- protocol buffer (0)
- jmx (2)
- jboss/weblogic (1)
- flex3 (12)
- 设计模式 (1)
- apache (0)
- php (4)
- struts1&2 (2)
- oracle SOA (2)
- 微博短链接的生成算法(Java版本) (1)
- htmlparser (3)
- quartz (2)
- mail (1)
- 乱码 (2)
- txt (1)
- eclipse (7)
- 分类 (0)
- 数据库 (1)
- svn (1)
- 日志 (1)
- struts2 (4)
- jquery (2)
- 编码 (1)
- 路径,java (1)
- SOHO (1)
- 娱乐 (2)
- frameset (1)
- maven (1)
- 反射 (1)
- truts2 (1)
- 敏捷,scrum (1)
- OA (1)
- english (1)
- oralce (1)
- wampserver (1)
- 会计 (1)
- springmvc (1)
- js (1)
- CMA (1)
最新评论
-
ludabing:
[/color][color=yellow]
spring @component的作用 -
netwelfare:
EL表达式中null和empty的区别,可以看这篇文章:htt ...
EL表达式中empty的用法 -
wjs王结胜:
...
spring @component的作用 -
di1984HIT:
哈哈。真不错啊。~
微博短链接的生成算法(Java版本) -
di1984HIT:
不错,不错。。。
spring @component的作用
深入浅出URL编码
版权声明:如有转载请求,请注明出处:http://blog.csdn.net/yzhz 杨争 一、问题: 1、在URL中中文字符通常出现在以下两个地方: 二、基础知识: 当对字符串进行编码和解码的时候都涉及到字符集,通常使用的字符集为ISO8859-1、GBK、UTF-8、UNICODE。 1、ContextPath是在Servlet服务器的配置文件中指定的。 对于jboos: 2、ServletPath是在应用的web.xml中配置。 2、Servlet API (1) 对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString是URL encode按照GBK编码。 (3) 对于中文firefox,则pathInfo和queryString都是URL encode按照GBK编码。 很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码。对于中文的IE和FIREFOX都是采用GBK编码QueryString。 小结:解决方案: 2、我们建议URL中PathInfo和QueryString采用相同的编码,这样对服务器端处理的时候会更加简单。 2、还有一个问题,我发现很多程序员并不明白URL Encode是需要指定字符集的。不明白的人可以看看这篇文档:http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/URLEncoder.html 2、 POST提交 解决方案: 这里所说的"指定的字符集"是在应用服务器的配置文件中配置。 (1) tomcat服务器 <Connector port="8080" ... useBodyEncodingForURI="true" /> (2) weblogic服务器 (三)浏览器显示 总结: 2、我们建议URL中的URL Encode编码的字符集和网页的contentType的字符集采用相同的字符集,这样程序的实现就很简单,不用做复杂的编码转换。
编码问题是JAVA初学者在web开发过程中经常会遇到问题,网上也有大量相关的文章介绍,但其中很多文章并没有对URL中使用了中文等非ASCII的字符造成服务器后台程序解析出现乱码的问题作出准确的解释和说明。本文将详细介绍由于在URL中使用了中文等非ASCII的字符造成乱码的问题。
(1)、Query String中的参数值,比如http://search.china.alibaba.com/search/offer_search.htm?keywords=中国
(2)、servlet path,比如:http://search.china.alibaba.com/selloffer/中国.html
2、出现乱码问题的原因主要是以下几方面:
(1)、浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范(http://www.w3.org/International/O-URL-code.html)。
(2)、Servlet服务器:Servlet服务器的没有正确配置。
(3)、开发人员并不了解Servlet的规范和API的含义。
1、一个http请求经过的几个环节:
浏览器(ie firefox)【get/post】------------>Servlet服务器------------------------------->浏览器显示
编码 解码成unicode,然后将显示的内容编码 解码
(1) 浏览器把URL(以及post提交的内容)经过编码后发送给服务器。
(2) 这里的Servlet服务器实际上指的是由Servlet服务器提供的servlet实现ServletRequestWrapper,不同应用服务器的servlet实现不同,这些servlet的实现把这些内容解码转换为unicode,处理完毕后,然后再把结果(即网页)编码返回给浏览器。
(3) 浏览器按照指定的编码显示该网页。
2、URL的组成:
域名:端口/contextPath/servletPath/pathInfo?queryString
说明:
对于weblogic:
contextPath是在应用的weblogic.xml中配置。
<context-root>/</context-root>
对于tomcat:
contextPath是在server.xml中配置。
<Context path="/" docBase="D:/server/blog.war" debug="5" reloadable="true" crossContext="true"/>
contextPath是在应用的jboss-web.xml中配置。
<jboss-web>
<context-root>/</context-root>
</jboss-web>
<servlet-mapping>
<servlet-name>Example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
我们使用以下servlet API获得URL的值及参数。
request.getParameter("name"); // 获得queryString的参数值(来自于get和post),其值经过Servlet服务器URL Decode过的
request.getPathInfo(); // 注意:pathinfo返回的字符串是经过Servlet服务器URL Decode过的。
requestURI = request.getRequestURI(); // 内容为:contextPath/servletPath/pathinfo 浏览器提交过来的原始数据,未被Servlet服务器URL Decode过。
3、开发人员必须清楚的servlet规范:
(1) HttpServletRequest.setCharacterEncoding()方法 仅仅只适用于设置post提交的request body的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。很多文章并没有说明这一点。
(2) HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。
(3) HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。
(4) POST提交的数据是作为request body的一部分。
(5) 网页的Http头中ContentType("text/html; charset=GBK")的作用:
(a) 告诉浏览器网页中数据是什么编码;
(b) 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。
这里需要注意的是:这里所说的ContentType是指http头的ContentType,而不是在网页中meta中的ContentType。
三、下面我们分别从浏览器和应用服务器来举例说明:
URL:http://localhost:8080/example/中国?name=中国
汉字 编码 二进制表示
中国 UTF-8 0xe4 0xb8 0xad 0xe5 0x9b 0xbd[-28, -72, -83, -27, -101, -67]
中国 GBK 0xd6 0xd0 0xb9 0xfa[-42, -48, -71, -6]
中国 ISO8859-1 0x3f,0x3f[63, 63]信息失去
(一)、浏览器
1、GET方式提交,浏览器会对URL进行URL encode,然后发送给服务器。
(1) 对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo是URL Encode是按照UTF-8编码,QueryString是按照GBK编码。
http://localhost:8080/example/中国?name=中国
实际上提交是:
GET /example/%E4%B8%AD%E5%9B%BD?name=%D6%D0%B9%FA
实际上提交是:
GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
实际上提交是:
GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
1、URL中如果含有中文等非ASCII字符,则浏览器会对它们进行URLEncode。为了避免浏览器采用了我们不希望的编码,所以最好不要在URL中直接使用非ASCII字符,而采用URL Encode编码过的字符串%.
比如:
URL:http://localhost:8080/example/中国?name=中国
建议:
URL:http://localhost:8080/example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
对于POST方式,表单中的参数值对是通过request body发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。
在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据。
1、从最简单,所需代价最小来看,我们对URL以及网页中的编码使用统一的编码对我们来说是比较合适的。
如果不使用统一编码的话,我们就需要在程序中做一些编码转换的事情。这也是我们为什么看到有网络上大量的资料介绍如何对乱码进行处理,其中很多解决方案都只是一时的权宜之计,没有从根本上解决问题。
(二)、Servlet服务器
Servlet服务器实现的Servlet遇到URL和POST提交的数据中含有%的字符串,它会按照指定的字符集解码。下面两个Servlet方法返回的结果都是经过解码的:
request.getParameter("name");
request.getPathInfo();
对于tomcat服务器,该文件是server.xml
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="GBK"/>
URIEncoding告诉服务器servlet解码URL时采用的编码。
useBodyEncodingForURI告诉服务器解码URL时候需要采用request body指定的编码。
对于weblogic服务器,该文件是weblogic.xml
<input-charset>
<java-charset-name>GBK</java-charset-name>
</input-charset>
浏览器根据http头中的ContentType("text/html; charset=GBK"),指定的字符集来解码服务器发送过来的字节流。我们可以调用HttpServletResponse.setContentType()设置http头的ContentType。
1、URL中的PathInfo和QueryString字符串的编码和解码是由浏览器和应用服务器的配置决定的,我们的程序不能设置,不要期望用request.setCharacterEncoding()方法能设置URL中参数值解码时的字符集。
所以我们建议URL中不要使用中文等非ASCII字符,如果含有非ASCII字符的话要使用URLEncode编码一下,比如:
http://localhost:8080/example1/example/中国
正确的写法:
http://localhost:8080/example1/example/%E4%B8%AD%E5%9B%BD
并且我们建议URL中不要在PathInfo和QueryString同时使用非ASCII字符,比如
http://localhost:8080/example1/example/中国?name=中国
原因很简单:不同浏览器对URL中PathInfo和QueryString编码时采用的字符集不同,但应用服务器对URL通常会采用相同的字符集来解码。
发表评论
-
DISCUE盖楼器
2013-10-24 13:34 1252package com.soft.hr.per.service ... -
svn文件影响编译速度解决办法
2011-11-05 10:06 1696在eclipse开发环境中正常编译java文件时,eclip ... -
项目经理,产品经理,架构师
2011-08-29 12:54 2038理想:产品经理设计出简单好用的产品,并能理解技术约束和 ... -
题目
2011-08-28 13:01 17内容22222222222222222222222222222 ... -
如何用QTP录制鼠标右键点击事件
2011-08-25 17:09 1688qtp录制鼠标右键单击事件要通过模拟键盘操作来实现st ... -
Eclipse中要导出jar包中引用了第三方jar包怎么办【】
2011-08-25 15:17 3594单击菜单栏中 ... -
面试题整理2
2011-08-25 12:13 727现有n个人和m个桌子.当每桌做3个人时,多出来2个人. ... -
java把下载html批量换成chm电子书
2011-08-25 10:11 1392利用微软的hhc.exe来把需要转换成chm的htm ... -
java用链表解约瑟夫环问题
2011-08-25 09:36 10881到20的数围成一个圈,隔两个取出一个,直到所有的数都 ... -
CKEditor用法
2011-08-25 09:23 1517config.js ckeditor.editor ... -
工作难题
2011-08-24 15:00 1158function showitem(oid,order ... -
Rational.Rose7.0系统软件
2011-08-24 14:13 3065ibm.rational.rose7.0系统软件01. ... -
[] 探索建立私人的科技资料检索系统
2011-08-23 10:42 1354由于经济条 ... -
一、Java字节代码的操纵
2011-08-22 14:54 637<address style="tex ... -
线程状态的换
2011-08-22 13:09 1014<div><div>scjp5 ... -
线程的调度—优先级
2011-08-22 12:53 1157<div>与线程休眠类似,线程的优先级仍然 ... -
类 Hibernate Session DBUtil
2011-08-22 12:16 1259package com.core.util;impor ... -
利用Annotation构建针对POJO进行增删改操作
2011-08-22 12:12 1157package com.core.annotation ... -
360 Or QQ
2011-08-22 08:48 1194前几天,360忽然跳 ... -
XML JAVA解析 -- DOM
2011-08-19 14:27 1351dom : document object model ...
相关推荐
### 深入浅出Greasemonkey优化 #### 1. 开始 ##### 1.1 Greasemonkey是什么? Greasemonkey是一个专为Mozilla Firefox设计的浏览器扩展插件,它允许用户通过自定义JavaScript脚本来改变网页的行为与功能。通过...
2,在mysql jdbc连接的url中,必须指定采用utf-8 encoding。 jdbc:mysql://localhost/forum?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8 3,在jsp页面中,指定页面采用UTF-8编码. ;charset=utf-8"%...
本教程旨在帮助开发者深入理解Spring的核心概念和技术,从而更好地应用在实际项目中。 1. **依赖注入(Dependency Injection,DI)**:Spring的核心特性之一,允许开发者将对象之间的依赖关系解耦,使得组件之间...
《深入浅出Nginx之二【基本配置】》这篇博文主要探讨了Nginx的基础配置,涵盖了Nginx作为一款高性能的Web服务器和反向代理服务器如何进行配置以满足不同场景的需求。以下是对该文内容的详细解读: 1. **Nginx简介**...
在这个“Tapestry深入浅出 水果案例(全)”的学习资源中,我们将深入探讨如何利用Tapestry来构建一个实际的水果管理系统。 1. **Tapestry简介** - Tapestry是一个基于组件的框架,它允许开发者通过组合可重用的UI...
本下载包说明 ------------- <br/>本下载包是《深入浅出Hibernate》(http://www.redsaga.com/hibernate_book.html)一书的配套教程程序,目前版本为1.0. <br/>本下载包与书籍的实战篇紧密结合. <br...
本资源“深入浅出Java语言程序设计”旨在帮助读者全面理解和掌握Java编程技术,无论你是初学者还是有一定经验的程序员,都能从中受益。 1. **基础概念** - **Java简介**:Java是由Sun Microsystems开发的面向对象...
- `re.UNICODE`:默认情况下,正则表达式引擎将字符串视为ASCII编码,此标志使得字符串被视为Unicode编码。 - `re.VERBOSE`:允许在正则表达式中使用空白符和注释。 **2. 复杂正则表达式的构建** - 正则表达式...
- `JSP指令`:如`<%@page...%>`,会被翻译成对应的Java代码,比如设置页面编码、导入包等。 **优化JSP页面响应速度的技巧** 1. **预编译JSP**:通过Ant等工具预先将JSP页面翻译并编译成Servlet,减少首次访问时的...
# 深入浅出了解HTTP协议 ## HTTP协议简介 HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网中最广泛使用的应用层协议之一,主要用于传输超文本内容,例如HTML文档、图像、视频等多媒体资源。HTTP协议...
`url-loader`处理小图片,将它们转化为base64编码内联到CSS或JS中,减少HTTP请求。`file-loader`则负责处理大图片,将其复制到指定目录,并返回一个public URL,这个URL在运行时指向编译后的图片。 在HTML、JS和CSS...
本书深入浅出地介绍了Servlet与JSP技术,帮助读者掌握Web应用开发的核心概念与实践技巧。 在描述部分提及了URL编码的重要性以及在HTTP GET请求中参数如何被附加到URL作为查询字符串。例如,当一个HTML页面上的表单...
- **简介**: 该书由Stan Lippman撰写,深入浅出地介绍了C++的核心特性及其实际应用案例,是学习C++的必备读物之一。 #### 3. **《Visual C++ (高级教程)》ISO** - **链接**: ...
- **安全对象**:表示具体的保护资源,如URL、方法等。 - **访问控制列表**:定义了每个资源的具体访问控制规则。 ##### 2.5 结论 Acegi Security提供了一个全面而灵活的安全框架,可以帮助开发者轻松实现复杂的...
崔希凡老师的JavaWeb课程以其深入浅出的讲解方式受到广大开发者的欢迎。本资源包"传智播客崔希凡JavaWeb-day10-java web之requestrespone-全部资料"涵盖了第十天课程的完整学习材料,帮助学生深化对HTTP请求与响应的...
知识点概述: ...通过上述知识点的介绍,可以看出本文内容不仅仅是提供了一段代码示例,而是深入浅出地介绍了使用jQuery进行URL参数读取的整个过程,包括了前端JavaScript编程中常用的一些技术和概念。