2008-10-08 174 views
3

我正在編寫一個Java應用程序,該應用程序接受可能被編碼或不被編碼的URL參數值。我需要一個簡單的方法來判斷我是否需要對參數字符串進行編碼。如何判斷一個URL參數是否需要用Java編碼

換句話說,我想要一個函數boolean needsEncoding(String param),如果我傳入字符串「[email protected]」,將返回true;如果我傳入「foo%40test.com」,則返回false。這個想法的問題是這是不明確的。我怎麼知道後一個字符串中的「%」符號是否應該被編碼?處理這個問題的一個方法是修改我的合同 - 要求客戶端傳遞未編碼的字符串,以便我知道我總是需要對它們進行編碼。思考?

回答

6

我想我應該把這個作爲一個建議的回答,使人們可以投票:

一種方式來處理,這是改變我的合同 - 要求客戶在未編碼字符串傳遞這樣我才知道我總是需要對它們進行編碼。

+0

我投了你的答案。改變合同是有道理的 – anjanb 2008-10-08 17:21:00

+0

總是最好不要猜測。 – Rontologist 2008-10-08 17:24:22

+0

如果用戶想設置foo%40test.com,則無法檢測用戶是否想要f​​oo%40test.com或[email protected]。改變合同。 – Horcrux7 2008-10-08 20:53:40

0

跡象字符串已經URL編碼:

  1. 沒有空格,但很多加符號。
  2. 所有百分比符號後跟兩位數字。
  3. 在a..b,A..B,0..9,「。」,「_」,「 - 」,「*」,「%」和「+」之外沒有字符。

不過,我認爲,改變合同是推薦這裏的行動。

1

如何解碼字符串並檢查原始字符串和解碼字符串之間的所有差異是否爲有效的url實體。

0

你可以輸入使用java.net.URLDecoder,看看它是否通過比較輸入和輸出字符串值發生變化。查看URLDecoderJavadocs,它描述了它應用於輸入字符串的業務邏輯,以確定它是否需要URL解碼。

如果你必須得到一個boolean結果,不想承擔試圖解碼的開銷來獲取boolean結果,你總是可以破解打開URLDecoder類的源代碼,並使用它用來確定相同的業務邏輯如果URL解碼是必要的。

0

這是我處理這個問題的常用方法。首先,由於+是一個惱人的特例,我不允許它作爲編碼的一部分。如果他們加上一個加號,這是一個加號,如果他們想要一個空格,他們可以按下鍵盤底部的那個大號欄。 (是的,我已經把它作爲一些合同的一部分)。但是,實際上,當你爲你的客戶努力工作時,你可以將其解釋清楚,以免他們自己編碼。

然後我重寫java.net.URLDecoder.decode刪除「+」的情況。 (真的只是切割和粘貼到我爲該項目使用的任何實用程序類,並刪除〜4行)。

然後,對於我得到的所有東西,我只是通過解碼器,然後運行編碼器。這將解碼並重新編碼它,如果編碼,或編碼它,如果沒有編碼。我從幾年前的某個人那裏得到了這個建議,不記得誰給予適當的信貸。

所以我結束了:

String properlyencodedstring = 
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8"); 

唯一的一次,在這可能需要的調整將是大羣體需要的URL的數據的情況下,要輸入和處理,是將我的假設,使用input type="url"(對於舊瀏覽器使用某種JavaScript填充),並使用.replaceAll("+", " ")進行預處理,因爲在這種情況下不會允許輸入任何空格。 (很可能,反正用java.net.URI

相關問題