url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端没法得到正确的参数值,如何是好?
解决办法
将这些字符转化成服务器能够识别的字符,对应关系以下:
URL字符转义
用其它字符替代吧,或用全角的。
+ URL 中+号表示空格 %2B
空格 URL中的空格能够用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的URL和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3Dapache
URL中的空格有时候被编码成%20,有时候被编码成加号+,曾经迷糊过一段时间,后来查了下资料才搞明白。数组
一个URL的基本组成部分包括协议(scheme),域名,端口号,路径和查询字符串(路径参数和锚点标记就暂不考虑了)。路径和查询字符串之间用问号?分离。例如http://www.example.com/index?param=1,路径为index,查询字符串(Query String)为param=1。URL中关于空格的编码正是与空格所在位置相关:空格被编码成加号+的状况只会在查询字符串部分出现,而被编码成%20则能够出如今路径和查询字符串中。浏览器
形成这种混乱局面的缘由在于:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,因此几乎全部使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。而在另外一份规范(RFC 2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),所以空格会被编码成%20,加号+自己也做为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来讲,它可能不接受查询字符串中出现加号+,认为它是非法字符。因此一个安全的举措是URL中统一使用%20来编码空格字符。tomcat
Java中的URLEncoder本意是用来把字符串编码成application/x-www-form-urlencoded MIME格式字符串,也就是说仅仅适用于URL中的查询字符串部分,可是URLEncoder常常被用来对URL的其余部分编码,它的encode方法会把空格编成加号+,与之对应的是,URLDecoder的decode方法会把加号+和%20都解码为空格,这种违反直觉的作法形成了当初我对空格URL编码问题的困扰。所以后来个人作法都是,在调用URLEncoder.encode对URL进行编码后(全部加号+已被编码成%2B),再调用replaceAll(“\\+”, “%20″),将全部加号+替换为%20。安全