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。安全