在web开发中经常会用到url传参数,而且还会有很多传中文参数的,在这里我给大家总结讲解几种url乱码解决的方法:
建议:最好整个工程用一种统一的编码方式,如UTF-8(无论是在页面中还是在编码过滤器中)
在这里我介绍几种我工作中遇到的乱码问题:
方法一:具体问题具体分析
在后台中先获得字符串的iso-8859-1编码形式数组,再使用此数组实例一个UTF-8编码形式String类型字符串.
如页面提交的url为:
url=……leavesp?work=中文
后台处理:
String inStr=request.getParameter("work ");
String outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");
方法二:url编码
<script type="text/javascript">
function dogetMethod(url)
{
//url编码前: leavesp?work=部门主管审批
url=encodeURI(url);
//url编码后:
leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9
window.open(uri,’’,’’);
}
</script>
后台部分:(解码)
String inStr= request.getParameter("work ");
String outStr=java.net.URLDecoder.decode(inStr);
方法三:写Filter统一处理
java类:
package com.yt.base;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 实现url中文乱码的处理
* @author He Rongbing
* @注意:这里的filter通过页面url的parammer转发生成了request的attribute参数,
* 在后台取的时候,就要从attribute中取得。这样就在requst的attribute中转发了一些同名的参数,
* 在调用的时候,可能用到中文的地方,都要用request.getAttribue(parammeterName)得到参数;缺点是会导致网络传输量加大。
*/public class EncodingFilter implements Filter
{
protected FilterConfig filterConfig;
/**
*
* 初始化
*
*/
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;
}
/**
*
* 将inStr转为UTF-8的编码形式
*
* @param inStr
* 输入字符串
*
* @return UTF-8的编码形式的字符串
*
* @throws UnsupportedEncodingException
*
*/
private String toUTF(String inStr) throws UnsupportedEncodingException
{
String outStr = "";
if (inStr != null)
{
// outStr=java.net.URLDecoder.decode(inStr);//不用decode了,到这的时候就已经自动decode过了
// 将字符串转为UTF-8编码形式
String encoding = filterConfig.getInitParameter("encoding");//这里用filter的初始化参数配置UTF-8
outStr = new String(inStr.getBytes("iso-8859-1"), encoding);
}
return outStr;
}
/**
*
* 中文乱码过滤处理
*
*/
public void doFilter(ServletRequest svlrequest,
ServletResponse svlresponse,
FilterChain chain) throws IOException, ServletException
{
// 将Servlet请求与响应对象转换成HttpServlet请求与响应对象
HttpServletRequest request = (HttpServletRequest) svlrequest;
HttpServletResponse response = (HttpServletResponse) svlresponse;
// 获得请求的方式(1.post or 2.get),根据不同请求方式进行不同处理
String method = request.getMethod();
// 1.以post方式提交的请求,直接设置编码为UTF-8
if (method.equalsIgnoreCase("post"))
{
try
{
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 2.以get方式提交的请求
else
{
// 取出客户提交的参数集
Enumeration<String> paramNames = request.getParameterNames();
// 遍历参数集取出每个参数的名称及值
while (paramNames.hasMoreElements())
{
String name = paramNames.nextElement();// 取出参数名称
String values[] = request.getParameterValues(name);// 根据参数名称取出其值
// 如果参数值集不为空
if (values != null)
{
// 如果参数值集中只有一个值
if (values.length == 1)
{
try
{
// 调用toUTF(values[0])函数,(values[0]即第一个参数值)方法转换参数值的字元编码
String vlustr = toUTF(values[0]);
// 并将该值以属性的形式藏在request
request.setAttribute(name, vlustr);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 如果参数值集中有多个值
else
{
// 遍历参数值集
for (int i = 0; i < values.length; i++)
{
try
{
// 回圈依次将每个值调用toUTF(values[i])方法转换参数值的字元编码
String vlustr = toUTF(values[i]);
values[i] = vlustr;
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 将该值以属性的形式藏在request
request.setAttribute(name, values);
}
}
}
}
// 设置响应方式和支持中文的字元集
response.setContentType("text/html;charset=UTF-8");
// 继续执行下一个filter,无一下个filter则执行请求
chain.doFilter(request, response);
}
/**
*
* 销毁方法
*
*/
public void destroy()
{
}
}
web.xml:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
com.yt.base.EncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:这里的filter通过页面url的parammer转发生成了request的attribute参数,在后台取的时候,就要从attribute中取得。这样就在requst的attribute中转发了一些同名的参数,在调用的时候,可能用到中文的地方,都要用request.getAttribue(parammeterName)得到参数;缺点是会导致网络传输量加大。
方法四:改tomcat的server.xml
如果有一些转码也转不过来的话,可是试试打开tomcat的server.xml,找到 <ConnectoracceptCount="100"connectionTimeout="20000"disableUploadTimeout="true"port="80"redirectPort="8443"> <connector port="80" face="Arial" redirectport="8443" disableuploadtimeout="true" connectiontimeout="20000" acceptcount="100"></connector>
并在最后加上useBodyEncodingForURI="true" URIEncoding="UTF-8",如下<ConnectoracceptCount="100"connectionTimeout="20000"disableUploadTimeout="true"port="80"redirectPort="8443"useBodyEncodingForURI="true"
URIEncoding="UTF-8">