关于url编码问题的处理的几个方法的总结

有同事讨论到关于url编码的问题。
因此总结以下几点方法供大家参考。
首先,对于post请求的时候,通过过滤器就可以搞定,以下的方法主要是针对get方式的乱码处理。

1. 手工对字符串编码解码的方法为:
java.net.URLEncoder.encode("测试","UTF-8");
java.net.URLDecoder.decode("%E6%B5%8B%E8%AF%95%26%3Faaa","UTF-8");

这个方法适用于自己从原始字符串中进行解码处理。

2. tomcat服务器的处理url编码的方法:

修改tomcat的server.xml增加指定的编码,以代替tomcat默认的ISO-8859-1。
需要增加的参数为: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"/>

(这个方法最简单方便,但是使用这种的方法之后,代码中就不需要也能有new String(strvalue.getBytes("ISO8859-1","GBK"); 这样的处理方式)

3.对于已经部署的系统,可能已经有其他同事对编码使用了
new String(strvalue.getBytes("ISO8859-1","GBK"); 
这样的方法作了处理,这个时候使用第二种方法就可能会影响到其它模块的正常使用,

因此,我们可以自己重新解析queryString我封装了几个方法。使用重新封装的方法可以在不影响原来系统的情况下,正确的获得参数。

封装的代码如下,供大家参考:


/**
* 从请求的url字符串中解析参数,当request.getParameterValues()取得的参数值编码值不正确的时候可以使用该方法
* @param request HttpServletRequest
* @param paramName String
* @return String[] 返回多个同参数名的值
*/
public static String[] getParamsFromQueryString(HttpServletRequest request,
String paramName) {
return getParamsFromQueryString(request.getQueryString(), paramName);
}

/**
* 从请求的url字符串中解析参数,当request.getParameterValues()取得的参数值编码值不正确的时候可以使用该方法
* @param request HttpServletRequest
* @param paramName String
* @return String[]
*/
public static String getParameterFromQueryString(HttpServletRequest request,
String paramName) {
return getParameterFromQueryString(request.getQueryString(), paramName);
}

/**
* 从请求的url字符串中解析参数,当request.getParameter()取得的参数值编码值不正确的时候可以使用该方法
* @param queryString String
* @param paramName String
* @return String 只返回一个值
*/
public static String getParameterFromQueryString(String queryString,
String paramName) {
String[] s = getParamsFromQueryString(queryString, paramName);
if (s != null && s.length >= 1) {
return s[0];
}
return null;
}

/**
* 从请求的url字符串中解析参数,当request.getParameter()取得的参数值编码值不正确的时候可以使用该方法
* @param queryString String
* @param paramName String
* @return String[] 返回多个同参数名的值
*/
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")); //根据需要修改自己要使用的编码。
}
catch (UnsupportedEncodingException ex) {
}
}
}
return (String[]) rsl.toArray(new String[0]);
}

public static void main(String[] args) {
//该例子演示解码。
//jsp和servlet中调用
// 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"));
}

转自[url]http://www.blogjava.net/lizongbo/archive/2007/09/29/39833.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值