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

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

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

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

过滤器代码:

    package filter;  

      

    import java.io.*;  

    import javax.servlet.*;  

    import javax.servlet.http.*;  

    import wrapper.GetHttpServletRequestWrapper;  

      

    public class ContentTypeFilter implements Filter {  

      

        private String charset = "UTF-8";  

        private FilterConfig config;  

          

        public void destroy() {  

            System.out.println(config.getFilterName()+"被销毁");  

            charset = null;  

            config = null;  

        }  

      

        public void doFilter(ServletRequest request, ServletResponse response,  

                FilterChain chain) throws IOException, ServletException {  

            //设置请求响应字符编码  

            request.setCharacterEncoding(charset);  

            response.setCharacterEncoding(charset);  

              

            HttpServletRequest req = (HttpServletRequest)request;  

              

              

            System.out.println("----请求被"+config.getFilterName()+"过滤");  

            //执行下一个过滤器(如果有的话,否则执行目标servlet)  

            chain.doFilter(req, response);  

              

            System.out.println("----响应被"+config.getFilterName()+"过滤");  

      

        }  

      

        public void init(FilterConfig config) throws ServletException {  

                this.config = config;  

                String charset = config.getServletContext().getInitParameter("charset");    

                if( charset != null && charset.trim().length() != 0)  

                {  

                    this.charset = charset;  

                }  

        }  

      

    }  

 

web.xml中过滤器配置:

    <!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->  

        <context-param>  

                <param-name>charset</param-name>  

                <param-value>UTF-8</param-value>  

        </context-param>  

      

        <filter>  

            <filter-name>ContentTypeFilter</filter-name>  

            <filter-class>filter.ContentTypeFilter</filter-class>  

        </filter>  

      

        <filter-mapping>  

            <filter-name>ContentTypeFilter</filter-name>  

            <url-pattern>/*</url-pattern>  

        </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字段中的参数不起作用,我们通常通过下面的代码来完成编码转换:

    String paramValue = request.getParameter("paramName");  

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

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

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

    <Connector port="8080" protocol="HTTP/1.1"   

               connectionTimeout="20000"   

               redirectPort="8443"   

               URIEncoding="UTF-8"  

     />  

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

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

    package wrapper;  

      

    import java.io.UnsupportedEncodingException;  

    import java.net.URLDecoder;  

      

    import javax.servlet.http.HttpServletRequest;  

    import javax.servlet.http.HttpServletRequestWrapper;  

      

    public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {  

      

        private String charset = "UTF-8";  

      

        public GetHttpServletRequestWrapper(HttpServletRequest request) {  

            super(request);  

        }  

      

        /**

         * 获得被装饰对象的引用和采用的字符编码

         * @param request

         * @param charset

         */  

        public GetHttpServletRequestWrapper(HttpServletRequest request,  

                String charset) {  

            super(request);  

            this.charset = charset;  

        }  

      

        /**

         * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换

         */  

        public String getParameter(String name) {  

            String value = super.getParameter(name);  

            value = value == null ? null : convert(value);  

            return value;  

        }  

      

        public String convert(String target) {  

            System.out.println("编码转换之前:" + target);  

            try {  

                return new String(target.trim().getBytes("ISO-8859-1"), charset);  

            } catch (UnsupportedEncodingException e) {  

                return target;  

            }  

        }  

      

    }  

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

    public void doFilter(ServletRequest request, ServletResponse response,  

                FilterChain chain) throws IOException, ServletException {  

            //设置请求响应字符编码  

            request.setCharacterEncoding(charset);  

            response.setCharacterEncoding(charset);  

            //新增加的代码          

            HttpServletRequest req = (HttpServletRequest)request;  

              

            if(req.getMethod().equalsIgnoreCase("get"))  

            {  

                req = new GetHttpServletRequestWrapper(req,charset);  

            }  

              

            System.out.println("----请求被"+config.getFilterName()+"过滤");  

            //传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象  

            chain.doFilter(req, response);  

              

            System.out.println("----响应被"+config.getFilterName()+"过滤");  

      

        }  

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

解决get方法传递URL参数中文乱码问题的更多相关文章

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

    来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下,我们通常这样来解决中文乱码问题: 过滤器代码: ...

  2. ajax url参数中文乱码解决方法

    较好的处理办法,对js的url中的中文参数值使用两次encodeURI(),即encodeURI(encodeURI("url的中文参数值")) JS代码: var name=&q ...

  3. ajax url参数中文乱码解决

    1.较好的处理办法,对js的url中的中文参数值使用两次encodeURI(),即 encodeURI(encodeURI("url的中文参数值")), java代码中使用URLD ...

  4. JS获取URL参数中文乱码解决

    var param = window.location.search; var paramArray = parseParams(param); var selectV = decodeURI(par ...

  5. 解决URL参数中文乱码

    string key = HttpUtility.UrlDecode(Request["key"], Encoding.UTF8);

  6. ASIHTTPRequest 中url参数中文乱码

    ASIHTTPReques确实是在开发过程中,数据的传输,获取方面给我们很大的帮助.然而在一些方面也是需要一些的注意. 在我们使用ASIHTTPReques 进行get方式获取数据时,如果需要传入中文 ...

  7. 解决get方法提交参数中文乱码问题:

    解决get方法提交参数中文乱码问题: 1找到你们的tomcat的目录 2在这个目录下面\tomcat61-32\tomcat61\conf 3找到server.xml ,用notepad打开(没有就下 ...

  8. URL传值中文乱码的解决

    使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码. 一.初级解决方法 通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行 ...

  9. js url传值中文乱码完美解决(JAVA)

    js url传值中文乱码完美解决(JAVA) 首先在你的jsp页面这样更改: var url="你要传入的Action的位置&ipid="+ipid+"& ...

随机推荐

  1. WPF使用Expression Design设计图形

    1.将画好的图形通过菜单导出成WPF xaml格式. 2.导出的文件就可以直接在WPF程序中使用了. 这里导出的DrawingBrush, <?xml version="1.0&quo ...

  2. 王译潇20162314 实验报告三plus结对编程四则运算第一阶段

    北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...

  3. minicom退出方法【转】

    本文转载自:https://blog.csdn.net/jhyworkspace/article/details/53572284 1)需使用Ctrl+a 进入设置状态2)按z进入设置菜单(1)S键: ...

  4. mysql——jdbc驱动下载&连接mysql例子

    mysql-connector-java-5.1.46.zip[解压后里面jar文件就是所需要的] https://dev.mysql.com/get/Downloads/Connector-J/my ...

  5. Mybatis层次结构图

  6. C++ 进阶学习 ——模板

    模板和重载类似,比重载更省事 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 类模板针对仅数据成员和成员函数类型不同的类. 一个简单的函数模板 template <cla ...

  7. iOS CoreData版本升级和数据库迁移

    app中使用了CoreData,并且在下一个版本中有实体变动,比如实体新增字段.修改字段等改动, 那么app在覆盖安装时就要进行数据库迁移, 否则app就会crash. 那如何实现数据库迁移呢?大概需 ...

  8. spring的AOP动态代理--JDK代理和CGLIB代理区分以及注意事项

    大家都知道AOP使用了代理模式,本文主要介绍两个代理模式怎么设置以及区别,对原文一些内容进行了引用后加入了自己的理解和更深入的阐述:   一.JDK代理和CGLIB代理的底层实现区别* JDK代理只能 ...

  9. 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 术语(二)

    你应该知道的在文档和对象模型中使用一些特定的术语: OpenID Connect Provider (OP) 授权服务器 Thinktecture IdentityServer v3 是一个.NET ...

  10. Go语言 进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿

    原文:http://www.cnblogs.com/shenguanpu/archive/2013/05/05/3060616.html 电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用py ...