当前位置:编程学习 > JAVA >>

JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器

一、乱码原因
 
①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。
 
②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)
 
 
 
 
二、解决办法
 
 
方法一 每次传输都手动设置编码(GET方式传输数据)
 
传输方
String name = URLEncoder.encode("徐越","UTF-8");
String path = "http://localhost:8008/xyWeb/xyServlet?name=" + name;
 
接收方
String name = new String(request.getParameter("name").getBytes("ISO8859-1","UTF-8"));
 
 
若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。
 
 
 
方法二(过滤器)
 
[java] 
/** 
 * 编码过滤器 
 *  
 * @author 徐越 
 *  
 */  
public class EncodingFilter implements Filter  
{  
    private String encoding;  
  
    public void init(FilterConfig fConfig) throws ServletException  
    {  
        encoding = fConfig.getInitParameter("encoding");  
    }  
  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception  
    {  
        HttpServletRequest httprequest = (HttpServletRequest) request;  
        if ("GET".equals(httprequest.getMethod()))  
        {  
            // 将httpRequest进行包装   
            EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);   
            chain.doFilter(wrapper, response);  
        }  
        else  
        {  
            request.setCharacterEncoding(encoding);  
            response.setContentType("text/html;charset=" + encoding);  
            chain.doFilter(request, response);  
        }  
    }  
  
    public void destroy()  
    {  
  
    }  
  
}  
  
  
/** 
 * httpRequest进行包装类 
 *  
 * @author 徐越 
 *  
 */  
public class EncodingHttpServletRequest extends HttpServletRequestWrapper  
{  
    private HttpServletRequest request;  
    private String encoding;  
  
    public EncodingHttpServletRequest(HttpServletRequest request)  
    {  
        super(request);  
        this.request = request;  
    }  
  
    public EncodingHttpServletRequest(HttpServletRequest request,String encoding)  
    {  
        super(request);  
        this.request = request;  
        this.encoding = encoding;  
          
    }  
    @Override  
    public String getParameter(String name)  
    {  
        String value = request.getParameter(name);  
        if (null != value)  
        {  
            try  
            {  
                // tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串   
                value = new String(value.getBytes("ISO8859-1"), encoding);  
            }  
            catch (UnsupportedEncodingException e)  
            {  
                e.printStackTrace();  
            }  
        }  
        return value;  
    }  
  
}  
 
/**
 * 编码过滤器
 * 
 * @author 徐越
 * 
 */
public class EncodingFilter implements Filter
{
private String encoding;
 
public void init(FilterConfig fConfig) throws ServletException
{
encoding = fConfig.getInitParameter("encoding");
}
 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception
{
HttpServletRequest httprequest = (HttpServletRequest) request;
if ("GET".equals(httprequest.getMethod()))
{
// 将httpRequest进行包装
EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding); 
chain.doFilter(wrapper, response);
}
else
{
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=" + encoding);
chain.doFilter(request, response);
}
}
 
public void destroy()
{
 
}
 
}
 
 
/**
 * httpRequest进行包装类
 * 
 * @author 徐越
 * 
 */
public class EncodingHttpServletRequest extends HttpServletRequestWrapper
{
private HttpServletRequest request;
private String encoding;
 
public EncodingHttpServletRequest(HttpServletRequest request)
{
super(request);
this.request = request;
}
 
public EncodingHttpServletRequest(HttpServletRequest request,String encoding)
{
super(request);
this.request = request;
this.encoding = encoding;
 
补充:Web开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,