程式扎記: [ Java 常見問題 ] How to encode URL to avoid special characters in java

標籤

2014年12月4日 星期四

[ Java 常見問題 ] How to encode URL to avoid special characters in java

Source From Here
Question
I need java code to encode URL to avoid special characters such as spaces and % and & ...etc

How-To
URL construction is tricky because different parts of the URL have different rules for what characters are allowed: for example, the plus sign is reserved in the query component of a URL because it represents a space, but in the path component of the URL, a plus sign has no special meaning and spaces are encoded as "%20".

RFC 2396 explains (in section 2.4.2) that a complete URL is always in its encoded form: you take the strings for the individual components (scheme, authority, path, etc.), encode each according to its own rules, and then combine them into the complete URL string. Trying to build a complete unencoded URL string and then encode it separately leads to subtle bugs, like spaces in the path being incorrectly changed to plus signs (which an RFC-compliant server will interpret as real plus signs, not encoded spaces).

In Java, the correct way to build a URL is with the URI class. Use one of the multi-argument constructors that takes the URL components as separate strings, and it'll escape each component correctly according to that component's rules.


The toASCIIString() method gives you a properly-escaped and encoded string that you can send to a server. To decode a URL, construct a URI object using the single-string constructor and then use the accessor methods (such as getPath()) to retrieve the decoded components.

Don't use the URLEncoder class! Despite the name, that class actually does HTML form encoding, not URL encoding. It's not correct to concatenate unencoded strings to make an "unencoded" URL and then pass it through a URLEncoder. Doing so will result in problems (particularly the aforementioned one regarding spaces and plus signs in the path).

Example
Sample code:
  1. //public URI(String scheme,  
  2. //   String userInfo,  
  3. //   String host,  
  4. //   int port,  
  5. //   String path,  
  6. //   String query,  
  7. //   String fragment)  
  8. //    throws URISyntaxException  
  9. URI uri = new URI("http"null"www.google.com.tw"80"/images/test .html""name=john&age=18"null)  
  10. printf("\t[Info] Encoded URL=%s\n", uri.toASCIIString())  
  11.   
  12. def origURL = "http://xlkompetence.dk/templates/beez5/html/amazon/0f75623a0a91913246abd04fccac12f5/login.php?action=billing_login=true&_session#line=10,20"  
  13. printf("\t[Info] Original URL=%s\n", origURL)  
  14. uri = new URI(origURL)  
  15. printf("\t\tScheme: %s\n", uri.getScheme())  
  16. printf("\t\tPort: %d\n", uri.getPort())  
  17. printf("\t\tPath: %s\n", uri.getPath())  
  18. printf("\t\tQuery: %s\n", uri.getQuery())  
  19. printf("\t\tFragment: %s\n", uri.getFragment())  
Execution Result:
[Info] Encoded URL=http://www.google.com.tw:80/images/test%20.html?name=john&age=18
[Info] Original URL=http://xlkompetence.dk/templates/beez5/html/amazon/0f75623a0a91913246abd04fccac12f5/login.php?action=billing_login=true&_session#line=10,20
Scheme: http
Port: -1
Path: /templates/beez5/html/amazon/0f75623a0a91913246abd04fccac12f5/login.php
Query: action=billing_login=true&_session
Fragment: line=10,20


沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!