前端js发送经过编码的http请求到gbk的后台应用,这时候需要进行编码解码的处理。
如
127.0.0.1:8080/xxx.xhtml?keywords=%E8%87%AA%E8%A1%8C%E8%BD%A6&encode=utf-8
当web应用收到这样的请求时,如果应用或者服务器上默认做了gbk编码的拦截处理,那么这时候用request.getParameter时将会出现乱码,解码后的中文字符最后一个字无法解码。
解决方法:用request.getQueryString()方式,获得queryString后自己重新解析这个url参数,代码如下
HttpServletRequest request ....;
String encode = StringUtil.trimToNull(request.getParameter("encode"));
//如果是utf-8编码
if (StringUtil.isEqualsIgnoreCase(encode, "utf-8")) {
//记录原始参数
if (request != null) {
Enumeration parameterNames = request.getParameterNames();
if(parameterNames!=null){
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement().toString();
String parameterValue = StringUtil.trimToNull(request.getParameter(parameterName));
if(parameterValue!=null){
//parameterValue = URLDecoder.decode(parameterValue, "UTF-8");
try {
//对参数进行特殊处理
String queryString = request.getQueryString();
String[] querys = StringUtil.split(queryString, "&");
if(querys!=null && querys.length > 0){
for(String query : querys){
parameterValue = StringUtil.substring(query, StringUtil.getLength(parameterName+"="));
parameterValue = URLDecoder.decode(parameterValue, encode);//根据encode参数值自定义解码
}
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
}
}
//对于没有传值的参数,直接忽略应该没有什么副作用
if (!StringUtil.isEmpty(parameterValue)) {
request.setAttribute(parameterName, parameterValue);
}
}
}
}else {
//错误异常处理
return false;
}
}
return true;