URLEncode和URLDecode的注意事項
package com.bigaka.common.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang.StringEscapeUtils;
/**
* @author shijing
* @version 建立時間:2016年4月23日 上午10:40:15
* 類說明
*/
public class EncodeUtils {
private static final String DEFAULT_URL_ENCODING = "UTF-8";
/**
* Hex編碼.
*/
public static String hexEncode(byte[] input) {
return Hex.encodeHexString(input);
}
/**
* Hex解碼.
*/
public static byte[] hexDecode(String input) {
try {
return Hex.decodeHex(input.toCharArray());
} catch (DecoderException e) {
throw new IllegalStateException("Hex Decoder exception", e);
}
}
/**
* Base64編碼.
*/
public static String base64Encode(byte[] input) {
return new String(Base64.encodeBase64(input));
}
/**
* Base64編碼, URL安全(將Base64中的URL非法字元如+,/=轉為其他字元, 見RFC3548).
*/
public static String base64UrlSafeEncode(byte[] input) {
return Base64.encodeBase64URLSafeString(input);
}
/**
* Base64解碼.
*/
public static byte[] base64Decode(String input) {
return Base64.decodeBase64(input);
}
/**
* URL 編碼, Encode預設為UTF-8.
*/
public static String urlEncode(String input) {
try {
return URLEncoder.encode(input, DEFAULT_URL_ENCODING);
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException("Unsupported Encoding Exception", e);
}
}
/**
* URL 解碼, Encode預設為UTF-8.
*/
public static String urlDecode(String input) {
try {
return URLDecoder.decode(input, DEFAULT_URL_ENCODING);
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException("Unsupported Encoding Exception", e);
}
}
/**
* Html 轉碼.
*/
public static String htmlEscape(String html) {
return StringEscapeUtils.escapeHtml(html);
}
/**
* Html 解碼.
*/
public static String htmlUnescape(String htmlEscaped) {
return StringEscapeUtils.unescapeHtml(htmlEscaped);
}
/**
* Xml 轉碼.
*/
public static String xmlEscape(String xml) {
return StringEscapeUtils.escapeXml(xml);
}
/**
* Xml 解碼.
*/
public static String xmlUnescape(String xmlEscaped) {
return StringEscapeUtils.unescapeXml(xmlEscaped);
}
/**
* 字串的壓縮
*
* @param str
* 待壓縮的字串
* @return 返回壓縮後的字串
* @throws IOException
*/
public static String compress(String str) throws IOException {
if (null == str || str.length() <= 0) {
return str;
}
// 建立一個新的 byte 陣列輸出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 使用預設緩衝區大小建立新的輸出流
GZIPOutputStream gzip = new GZIPOutputStream(out);
// 將 b.length 個位元組寫入此輸出流
gzip.write(str.getBytes());
gzip.close();
// 使用指定的 charsetName,通過解碼位元組將緩衝區內容轉換為字串
return out.toString("ISO-8859-1");
}
/**
* 字串的解壓
*
* @param str
* 對字串解壓
* @return 返回解壓縮後的字串 utf-8
* @throws IOException
*/
public static String unCompress(String str) throws IOException {
if (null == str || str.length() <= 0) {
return str;
}
// 建立一個新的 byte 陣列輸出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 建立一個 ByteArrayInputStream,使用 buf 作為其緩衝區陣列
ByteArrayInputStream in = new ByteArrayInputStream(str
.getBytes("ISO-8859-1"));
// 使用預設緩衝區大小建立新的輸入流
GZIPInputStream gzip = new GZIPInputStream(in);
byte[] buffer = new byte[256];
int n = 0;
while ((n = gzip.read(buffer)) >= 0) {// 將未壓縮資料讀入位元組陣列
// 將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此 byte陣列輸出流
out.write(buffer, 0, n);
}
// 使用指定的 charsetName,通過解碼位元組將緩衝區內容轉換為字串
return out.toString("utf-8");
}
}
注意:當進行URLEncode加密過的引數通過瀏覽器請求時,瀏覽器會自動URLDecode解密一次 。並且對於"%" 、 "+" 等特殊字元有不同的處理
也就是說,當需要傳播的字元,進行加密之後,進過HTTP Post請求或者 瀏覽器請求,接收方不需要再解密一次(這裡的程式碼工具類decode進行了兩次)
另外 jar包以及版本:
commons-codec-1.7.jar
commons-lang-2.3.jar
相關文章
- python中的urlencode和urldecode 【中文和url編碼轉換】Python
- URLEncode與URLDecode總結與實現
- Linux上怎麼直接使用urlencode、urldecode命令Linux
- 直流負載箱的安全事項和注意事項有哪些?負載
- Xlistview的注意事項View
- Android Handler的使用方式和注意事項Android
- shared_ptr的理解和注意事項
- Oracle複合索引的建立和注意事項Oracle索引
- jquery 的ajax請求示例和注意事項jQuery
- 網站投放廣告的注意事項和技巧網站
- RandomAccessFile注意事項randomMac
- nginx 注意事項Nginx
- @Lombok注意事項Lombok
- 換工作的注意事項
- Shrink操作的注意事項
- Oracle使用*的注意事項Oracle
- MAVEN新增本地倉庫和注意事項!Maven
- 關於Golang struct{}{}用法和注意事項GolangStruct
- [譯] Vue.js — 注意事項和技巧Vue.js
- hive查詢注意事項和調優Hive
- jQuery 語法總結和注意事項jQuery
- PHP物件和介面抽象類注意事項PHP物件抽象
- SVN衝突解決和注意事項
- Model設計中常見的技巧和注意事項
- 低程式碼和無程式碼的注意事項
- 快取注意事項快取
- 使用parallel注意事項Parallel
- 字串分割注意事項字串
- 函式注意事項函式
- DUPLICATE DATABASE 注意事項Database
- bootstrap引用注意事項boot
- ovm搭建注意事項
- CSP 考前注意事項
- 生產注意事項
- 電量注意事項
- C++ queue的注意事項C++
- SQL 語句的注意事項SQL
- java equals()方法的注意事項Java