有同事討論到關(guān)于url編碼的問題。
因此總結(jié)以下幾點(diǎn)方法供大家參考。
首先,對(duì)于post請(qǐng)求的時(shí)候,通過過濾器就可以搞定,以下的方法主要是針對(duì)get方式的亂碼處理。
1. 手工對(duì)字符串編碼解碼的方法為:
java.net.URLEncoder.encode("測試","UTF-8");
java.net.URLDecoder.decode("%E6%B5%8B%E8%AF%95%26%3Faaa","UTF-8");
這個(gè)方法適用于自己從原始字符串中進(jìn)行解碼處理。
2. tomcat服務(wù)器的處理url編碼的方法:
修改tomcat的server.xml增加指定的編碼,以代替tomcat默認(rèn)的ISO-8859-1。
需要增加的參數(shù)為:URIEncoding,
比如下面的例子是制定解碼使用UTF-8,
<Connector port="8080"
maxThreads="800" minSpareThreads="25" maxSpareThreads="100"
enableLookups="false" redirectPort="8443" acceptCount="0"
debug="0" connectionTimeout="20000" URIEncoding="UTF-8"
disableUploadTimeout="true" />
如果用到了apache與tomcat 的整合,則還需要:
<Connector port="8009" URIEncoding="UTF-8"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" maxThreads="1100" minSpareThreads="25" maxSpareThreads="100" acceptCount="0"/>
(這個(gè)方法最簡單方便,但是使用這種的方法之后,代碼中就不需要也能有new String(strvalue.getBytes("ISO8859-1","GBK"); 這樣的處理方式)
3.對(duì)于已經(jīng)部署的系統(tǒng),可能已經(jīng)有其他同事對(duì)編碼使用了
new String(strvalue.getBytes("ISO8859-1","GBK");
這樣的方法作了處理,這個(gè)時(shí)候使用第二種方法就可能會(huì)影響到其它模塊的正常使用,
因此,我們可以自己重新解析queryString我封裝了幾個(gè)方法。使用重新封裝的方法可以在不影響原來系統(tǒng)的情況下,正確的獲得參數(shù)。
封裝的代碼如下,供大家參考:
/**
* 從請(qǐng)求的url字符串中解析參數(shù),當(dāng)request.getParameterValues()取得的參數(shù)值編碼值不正確的時(shí)候可以使用該方法
* @param request HttpServletRequest
* @param paramName String
* @return String[] 返回多個(gè)同參數(shù)名的值
*/
public static String[] getParamsFromQueryString(HttpServletRequest request,
String paramName) {
return getParamsFromQueryString(request.getQueryString(), paramName);
}
/**
* 從請(qǐng)求的url字符串中解析參數(shù),當(dāng)request.getParameterValues()取得的參數(shù)值編碼值不正確的時(shí)候可以使用該方法
* @param request HttpServletRequest
* @param paramName String
* @return String[]
*/
public static String getParameterFromQueryString(HttpServletRequest request,
String paramName) {
return getParameterFromQueryString(request.getQueryString(), paramName);
}
/**
* 從請(qǐng)求的url字符串中解析參數(shù),當(dāng)request.getParameter()取得的參數(shù)值編碼值不正確的時(shí)候可以使用該方法
* @param queryString String
* @param paramName String
* @return String 只返回一個(gè)值
*/
public static String getParameterFromQueryString(String queryString,
String paramName) {
String[] s = getParamsFromQueryString(queryString, paramName);
if (s != null && s.length >= 1) {
return s[0];
}
return null;
}
/**
* 從請(qǐng)求的url字符串中解析參數(shù),當(dāng)request.getParameter()取得的參數(shù)值編碼值不正確的時(shí)候可以使用該方法
* @param queryString String
* @param paramName String
* @return String[] 返回多個(gè)同參數(shù)名的值
*/
public static String[] getParamsFromQueryString(String queryString,
String paramName) {
if (paramName == null || paramName.length() < 1 || paramName == null ||
paramName.length() < 1) {
return new String[0];
}
List rsl = new ArrayList();
String params[] = queryString.split("&");
for (int i = 0; i < params.length; i++) {
// System.out.println(params[i]);
if (params[i] != null && params[i].startsWith(paramName + "=")) {
try {
rsl.add(java.net.URLDecoder.decode(params[i].substring(paramName.
length() +
1), "UTF-8")); //根據(jù)需要修改自己要使用的編碼。
}
catch (UnsupportedEncodingException ex) {
}
}
}
return (String[]) rsl.toArray(new String[0]);
}
public static void main(String[] args) {
//該例子演示解碼。
//jsp和servlet中調(diào)用
// System.out.println(getParameterFromQueryString(request.getQueryString(), "q"));
//該例子示意的是gogole的url中的queryString。
System.out.println(getParameterFromQueryString(
"hl=zh-CN&newwindow=1&q=%E6%B5%8B%E8%AF%95%26%3Faaa&meta=", "q"));
}
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。