`
无量
  • 浏览: 1146412 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

来自:http://www.javaeye.com/topic/483158

应用一:解决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方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。

分享到:
评论

相关推荐

    Java Http请求传json数据乱码问题的解决

    在实际解决乱码问题的过程中,如果发现使用Base64加密传输中文数据还会出现问题,可以改用URL编码的方式来传输数据,即使用JavaScript的`encodeURI`函数对数据进行两次URL编码,后端接收到后进行一次URL解码即可。...

    java中文乱码解决问题

    JAVA 中文乱码解决问题 JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的...

    GET方法URL中传递中文参数乱码的解决方法

    尽管上述方法通常能解决大部分乱码问题,但为了避免不必要的麻烦,最好还是遵循“最好不要在URL中传递中文参数”的原则。因为URL可见且易于复制,如果包含敏感信息(如中文用户名),可能会增加隐私泄露的风险。另外...

    JSP-GET-POST传递的乱码问题

    然而,在处理中文参数时,尤其是通过GET和POST方法传递时,经常会出现乱码问题。这通常是由于字符编码不一致或者处理不当导致的。以下是对这一问题的详细解析: 首先,我们需要理解字符编码的基本概念。在Web中,...

    get请求乱码问题 java

    在IT领域,尤其是在Java开发中,GET请求的乱码问题是开发者经常会遇到的一个难题。这个问题主要源于字符编码的不一致,特别是在处理中文或者其他非英文字符时更为显著。下面将详细解析GET请求乱码的原因、解决方案...

    get方式传参中文乱码问题的解决方案

    GET请求中的参数是通过URL直接传递的,当参数包含中文字符时,如果URL编码不正确或者服务器端没有正确地解码这些参数,就会出现乱码问题。主要原因包括: 1. **客户端与服务器端编码不一致**:客户端发送请求时使用...

    Jsp页面在URL中传递参数会出现乱码问题解决

    在Web开发中,尤其是使用Java JSP技术时,我们可能会遇到URL中传递参数出现乱码的问题。这是因为不同的字符集编码方式可能导致字符在传输过程中无法正确解析。本文将详细介绍两种解决JSP页面URL参数乱码的方法,虽然...

    URL传参数时中文乱码解决方法

    在IT领域,尤其是在Web开发中,处理URL传递参数时遇到中文乱码是一个常见的问题,尤其当数据需要跨系统或在不同编码环境下传输时更为显著。本文将深入探讨URL传参数时中文乱码的原因、影响以及如何有效解决这一问题...

    JAVA POST与GET数据传递时中文乱码问题解决方法

    以下是一些解决Java POST与GET数据传递时中文乱码问题的方法。 1. **POST数据传递**: 在接收POST数据的JSP页面中,我们需要确保两个关键点: - **声明页面字符集**:`&lt;%@ page pageEncoding="UTF-8"%&gt;` 这行...

    知识共享-jsp页面中文参数传递get和post方法分析(雷惊风).

    ### 知识点详解:JSP页面中文参数传递GET与POST方法分析 #### 一、引言 在Java Web开发中,特别是在处理JSP页面时,中文参数的正确传递是常见的需求之一。不当的处理可能导致乱码问题,严重影响用户体验和数据的...

    java乱码自己解决的办法

    在Java开发过程中,字符编码问题常常困扰着开发者,尤其是在处理中文等多字节字符时,乱码问题尤为突出。本文将深入探讨Java乱码的根源,并提供一系列实用的解决方案,帮助开发者有效应对这一挑战。 ### Java乱码...

    java 用HttpsURLConnection进行传递中文时错误总结

    4. **URL编码**:对于GET请求,URL中的参数可能需要进行URL编码,防止特殊字符引起解析问题。使用`URLEncoder.encode()`方法: ```java String encodedParam = URLEncoder.encode("中文参数", "UTF-8"); String ...

    解决tomcat中文乱码问题

    ### 解决Tomcat中文乱码问题的详尽指南 在Java Web开发中,尤其是在使用Apache Tomcat服务器时,中文乱码问题是开发者常遇到的难题之一。本文将详细解析如何在Tomcat环境中解决中文乱码问题,确保中文字符的正确...

    超强过滤器彻底解决JSP-SERVLET中文参数GET-POST传递的问题(转)

    - 对于POST请求,由于在读取请求参数前可以设置编码,因此在Servlet中使用上述方法可以解决问题。 - 但是,如果需要同时处理GET和POST,以及避免每个Servlet都写相同的代码,那么创建一个全局Filter是最好的解决...

    中文乱码问题解决方法

    在 JSP 开发中,中文乱码问题是一个常见的问题,本文总结了 JSP 中中文乱码问题的解决方法,希望能够帮助正在烦恼中文乱码的人。 一、JSP 页面显示乱码 JSP 文件页面显示乱码是一种很常见的问题,这种情况比较好...

    jsp传值中文乱码问题解决方法示例介绍.docx

    在开发Web应用时,尤其是使用Java的JSP技术,开发者经常会遇到中文乱码的问题。这是因为字符编码不一致导致的,特别是在处理用户输入或从数据库获取数据时。本篇将详细介绍如何解决JSP传值过程中出现的中文乱码问题...

    过滤器实现get请求乱码问题

    在Java Web开发中,我们经常会遇到GET请求参数乱码的问题,尤其是在处理包含中文字符的URL时。这个问题可以通过使用Servlet Filter来解决。过滤器(Filter)是Java Servlet API的一部分,允许我们在请求到达目标...

    java乱码的解决方案

    ### Java乱码问题及其解决方案 在Java开发过程中,字符编码问题常常导致中文显示为乱码。乱码问题可能出现在各种场景下,例如JSP页面、Servlet处理请求等。本篇文章将详细探讨Java乱码问题产生的原因及解决方案。 ...

    动态加载iframe时get请求传递中文参数乱码解决方法

    然而,当我们在`iframe`的`src`属性中通过`GET`请求传递包含中文参数时,可能会遇到乱码问题。这是因为浏览器在处理URL时,默认的编码方式可能不兼容中文字符,导致中文字符无法正确解析。 首先,我们需要理解这个...

    Java编程中中文乱码问题的研究及解决方案

    Java编程中中文乱码问题是一个常见的困扰开发者的问题,尤其是在Java Web开发环境中。Java语言本身使用Unicode编码,这是一种全球化的标准,确保了各种字符集的兼容性。然而,Unicode编码在与其他系统交互时,如...

Global site tag (gtag.js) - Google Analytics