解决get方法传递URL参数中文乱码问题

转载 2016年05月30日 13:33:23

应用一:解决tomcat下中文乱码问题(先来个简单的) 

在tomcat下,我们通常这样来解决中文乱码问题:

过滤器代码:

  1. package filter;  
  2.   
  3. import java.io.*;  
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6. import wrapper.GetHttpServletRequestWrapper;  
  7.   
  8. public class ContentTypeFilter implements Filter {  
  9.   
  10.     private String charset = "UTF-8";  
  11.     private FilterConfig config;  
  12.       
  13.     public void destroy() {  
  14.         System.out.println(config.getFilterName()+"被销毁");  
  15.         charset = null;  
  16.         config = null;  
  17.     }  
  18.   
  19.     public void doFilter(ServletRequest request, ServletResponse response,  
  20.             FilterChain chain) throws IOException, ServletException {  
  21.         //设置请求响应字符编码  
  22.         request.setCharacterEncoding(charset);  
  23.         response.setCharacterEncoding(charset);  
  24.           
  25.         HttpServletRequest req = (HttpServletRequest)request;  
  26.           
  27.           
  28.         System.out.println("----请求被"+config.getFilterName()+"过滤");  
  29.         //执行下一个过滤器(如果有的话,否则执行目标servlet)  
  30.         chain.doFilter(req, response);  
  31.           
  32.         System.out.println("----响应被"+config.getFilterName()+"过滤");  
  33.   
  34.     }  
  35.   
  36.     public void init(FilterConfig config) throws ServletException {  
  37.             this.config = config;  
  38.             String charset = config.getServletContext().getInitParameter("charset");    
  39.             if( charset != null && charset.trim().length() != 0)  
  40.             {  
  41.                 this.charset = charset;  
  42.             }  
  43.     }  
  44.   
  45. }  
 

web.xml中过滤器配置:

  1. <!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->  
  2.     <context-param>  
  3.             <param-name>charset</param-name>  
  4.             <param-value>UTF-8</param-value>  
  5.     </context-param>  
  6.   
  7.     <filter>  
  8.         <filter-name>ContentTypeFilter</filter-name>  
  9.         <filter-class>filter.ContentTypeFilter</filter-class>  
  10.     </filter>  
  11.   
  12.     <filter-mapping>  
  13.         <filter-name>ContentTypeFilter</filter-name>  
  14.         <url-pattern>/*</url-pattern>  
  15.     </filter-mapping>  

request.setCharacterEncoding(charset); 必须写在第一次使用request.getParameter()之前,这样才能保证参数是按照已经设置的字符编码来获取。
response.setCharacterEncoding(charset);必须写在PrintWriter out = request.getWriter()之前,这样才能保证out按照已经设置的字符编码来进行字符输出。

通过过滤器,我们可以保证在Servlet或JSP执行之前就设置好了请求和响应的字符编码。

但是这样并不能完全解决中文乱码问题:

对于post请求,无论是“获取参数环节”还是“输出环节"都是没问题的;

对于get请求,"输出环节"没有问题,但是"获取参数环节"依然出现中文乱码,所以在输出时直接将乱码输出了。

原因是post请求和get请求存放参数位置是不同的:

post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,我们通常通过下面的代码来完成编码转换:

  1. String paramValue = request.getParameter("paramName");  
  2. paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);  

但是每次进行这样的转换实在是很麻烦,有没有统一的解决方案呢?

解决方案1: 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码

  1. <Connector port="8080" protocol="HTTP/1.1"   
  2.            connectionTimeout="20000"   
  3.            redirectPort="8443"   
  4.            URIEncoding="UTF-8"  
  5.  />  

这样做的缺点是,同一个tomcat下的其他应用也将受到影响。而其每次部署时都需要类修改配置也很麻烦。

解决方案2:自定义请求包装器包装请求,将字符编码转换的工作添加到getParameter()方法中

  1. package wrapper;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4. import java.net.URLDecoder;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletRequestWrapper;  
  8.   
  9. public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {  
  10.   
  11.     private String charset = "UTF-8";  
  12.   
  13.     public GetHttpServletRequestWrapper(HttpServletRequest request) {  
  14.         super(request);  
  15.     }  
  16.   
  17.     /** 
  18.      * 获得被装饰对象的引用和采用的字符编码 
  19.      * @param request 
  20.      * @param charset 
  21.      */  
  22.     public GetHttpServletRequestWrapper(HttpServletRequest request,  
  23.             String charset) {  
  24.         super(request);  
  25.         this.charset = charset;  
  26.     }  
  27.   
  28.     /** 
  29.      * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换 
  30.      */  
  31.     public String getParameter(String name) {  
  32.         String value = super.getParameter(name);  
  33.         value = value == null ? null : convert(value);  
  34.         return value;  
  35.     }  
  36.   
  37.     public String convert(String target) {  
  38.         System.out.println("编码转换之前:" + target);  
  39.         try {  
  40.             return new String(target.trim().getBytes("ISO-8859-1"), charset);  
  41.         } catch (UnsupportedEncodingException e) {  
  42.             return target;  
  43.         }  
  44.     }  
  45.   
  46. }  

修改过滤器的doFilter方法 代码如下:

  1. public void doFilter(ServletRequest request, ServletResponse response,  
  2.             FilterChain chain) throws IOException, ServletException {  
  3.         //设置请求响应字符编码  
  4.         request.setCharacterEncoding(charset);  
  5.         response.setCharacterEncoding(charset);  
  6.         //新增加的代码          
  7.         HttpServletRequest req = (HttpServletRequest)request;  
  8.           
  9.         if(req.getMethod().equalsIgnoreCase("get"))  
  10.         {  
  11.             req = new GetHttpServletRequestWrapper(req,charset);  
  12.         }  
  13.           
  14.         System.out.println("----请求被"+config.getFilterName()+"过滤");  
  15.         //传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象  
  16.         chain.doFilter(req, response);  
  17.           
  18.         System.out.println("----响应被"+config.getFilterName()+"过滤");  
  19.   
  20.     }  

这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。

spring转码过滤器,在web.xml文件中配置,

注意:filter是根据filter-mapping节点的顺序来执行的,为了避免其他filter在这个filter之前执行,所以请将这个filter-mapping放到最前面


URL?param=问号传参中文乱码的解决办法

只作收藏,自己使用。原文请看链接!
  • danielyhsu
  • danielyhsu
  • 2017年04月06日 20:32
  • 1666

彻底解决Spring MVC 中文乱码 问题

1:表单提交controller获得中文参数后乱码解决方案 注意: jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 修改w...
  • kalision
  • kalision
  • 2015年06月10日 14:03
  • 204155

Http的Get/Post请求带有特殊字符,400 Bad Request解决方案

今天做项目的时候,需要向服务器接口 传递 json参数,使用 apache 的 httpclient,当时没有对参数做特殊处理直接提交了,结果运行时报错了,如下: HTTP 400 Bad Req...
  • abc6368765
  • abc6368765
  • 2017年05月05日 14:13
  • 4099

Java 获取Http Get请求中文参数乱码解决方案

在Java web 中web服务器对于请求参数可以使用request.setCharacter(“”)方法对其进行编码,但是这种方式只会对请求的body部分进行编码解析,对于url中的参数不做处理。 ...
  • xieguojun2008
  • xieguojun2008
  • 2015年12月14日 17:09
  • 6687

关于HTTP的URL中带有中文的转码方法

有些时候会遇到连接中带有中文样式的URL 以下是针对不同方法的解决方式POST请求- (void)post { // 0.请求路径 NSString *urlStr = @"http...
  • taylorkwan111
  • taylorkwan111
  • 2017年03月23日 14:59
  • 1376

页面到后台的get传输时有关中文的转码问题

get后传中文参数时有试过在windon上是没问题的,但在Linux就有问题, 原本就进行了string 的编码转换ruleName = new String(ruleName.getBytes("...
  • ysxybyb
  • ysxybyb
  • 2017年02月17日 17:13
  • 586

get方式请求转码

/** 如果是get请求过来的方式,需要对参数进行转码 */ if(ServletActionContext.getRequest().getMethod().equalsIgnoreCase("G...
  • CWH615
  • CWH615
  • 2017年05月05日 18:14
  • 417

http 的post与get方法 以及处理中文乱码问题

本文将通过部署一个简单的服务器,并从客户端提交数据来学习post与get传递参数的方法,以及如何处理其中产生的中文乱码问题。 1.部署服务器      使用Java EE IDE(ecli...
  • u011572517
  • u011572517
  • 2016年01月03日 12:05
  • 2569

springMVC 返回中文字符串时乱码

SpringMVC的@ResponseBody注解可以将请求方法返回的对象直接转换成JSON对象,但是当返回值是String的时候,中文会乱码,原因是因为其中字符串转换和对象转换用的是两个转换器,而S...
  • yaov_yy
  • yaov_yy
  • 2016年07月04日 11:17
  • 4983

springMVC return "中文乱码"解决方法

后台很多时候要用到ajax验证,而且验证后可能要传一个内容到前台,虽然可以用out.print(),但不方便,也可以使用编码解码,但如果太多也不方便,今天在网上看到了一种方法,因为是跳转,肯定关系st...
  • xionglangs
  • xionglangs
  • 2015年12月02日 16:17
  • 1392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决get方法传递URL参数中文乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)