关闭

servlet中post与get请求中文乱码解决

1012人阅读 评论(0) 收藏 举报
分类:

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是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编码格式。
若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。

 

方法二(过滤器)

[java] view plain copy
 print?
  1. /** 
  2.  * 编码过滤器 
  3.  *  
  4.  * @author xy 
  5.  *  
  6.  */  
  7. public class EncodingFilter implements Filter  
  8. {  
  9.     private String encoding;  
  10.   
  11.     public void init(FilterConfig fConfig) throws ServletException  
  12.     {  
  13.         encoding = fConfig.getInitParameter("encoding");  
  14.     }  
  15.   
  16.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception  
  17.     {  
  18.         HttpServletRequest httprequest = (HttpServletRequest) request;  
  19.         if ("GET".equals(httprequest.getMethod()))  
  20.         {  
  21.             // 将httpRequest进行包装  
  22.             EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);   
  23.             chain.doFilter(wrapper, response);  
  24.         }  
  25.         else  
  26.         {  
  27.             request.setCharacterEncoding(encoding);  
  28.             response.setContentType("text/html;charset=" + encoding);  
  29.             chain.doFilter(request, response);  
  30.         }  
  31.     }  
  32.   
  33.     public void destroy()  
  34.     {  
  35.   
  36.     }  
  37.   
  38. }  
  39.   
  40.   
  41. /** 
  42.  * httpRequest进行包装类 
  43.  *  
  44.  * @author xy 
  45.  *  
  46.  */  
  47. public class EncodingHttpServletRequest extends HttpServletRequestWrapper  
  48. {  
  49.     private HttpServletRequest request;  
  50.     private String encoding;  
  51.   
  52.     public EncodingHttpServletRequest(HttpServletRequest request)  
  53.     {  
  54.         super(request);  
  55.         this.request = request;  
  56.     }  
  57.   
  58.     public EncodingHttpServletRequest(HttpServletRequest request,String encoding)  
  59.     {  
  60.         super(request);  
  61.         this.request = request;  
  62.         this.encoding = encoding;  
  63.           
  64.     }  
  65.     @Override  
  66.     public String getParameter(String name)  
  67.     {  
  68.         String value = request.getParameter(name);  
  69.         if (null != value)  
  70.         {  
  71.             try  
  72.             {  
  73.                 // tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串  
  74.                 value = new String(value.getBytes("ISO8859-1"), encoding);  
  75.             }  
  76.             catch (UnsupportedEncodingException e)  
  77.             {  
  78.                 e.printStackTrace();  
  79.             }  
  80.         }  
  81.         return value;  
  82.     }  
  83.   
  84. }  
[html] view plain copy
 print?
  1. <filter>  
  2.   <display-name>EncodingFilter</display-name>  
  3.   <filter-name>EncodingFilter</filter-name>  
  4.   <filter-class>cn.xy.filter.EncodingFilter</filter-class>  
  5.   <init-param>  
  6.     <description></description>  
  7.     <param-name>encoding</param-name>  
  8.     <param-value>UTF-8</param-value>  
  9.   </init-param>  
  10. </filter>  
  11. <filter-mapping>  
  12.   <filter-name>EncodingFilter</filter-name>  
  13.   <url-pattern>/*</url-pattern>  
  14. </filter-mapping>  
2
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34260次
    • 积分:572
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:25篇
    • 译文:0篇
    • 评论:0条