关于request.getParameter方法获得参数乱码问题

来源:互联网 发布:ip域名查询电信 编辑:程序博客网 时间:2024/06/03 22:48

     相信很多java初学者在学习request对象的时候会遇到一个很奇怪的问题,我明明已经设置了request.setCharacterEncoding("UTF-8");和response.setCharacterEncoding("UTF-8");为什么还会出现乱码呢?      这里我们要注意到这两个方法其实只是对Post请求效的,对Get请求是无效的。所以当你的form表单提交的时候是Get方法的时候存在中文的时候还是会出现乱码的。        如何解决呢?      一种简单的办法是在你获得参数的时候对它进行解码,然后在重新进来编码。new_value = new String(old_value.getBytes("ISO-8859-1"),   "UTF-8");          有人会问为什么是用ISO-8859-1进行解码呢,    这就要看你使用的是什么服务器了。  我用的是Tomcat,它的默认编码方式是ISO-8859-1  所以在程序中用这个进行解码,然后重新编码为UTF-8。          另外一种方法 你也可以写一个编码过滤器, 去重写request..getParameter方法。它的实现类的HttpServletRequestWrapper   所以我们要去继承这个类,然后重新, 下面是我的代码,你们可以参考一下。

class MyGetHttpServletRequestWrapper extends HttpServletRequestWrapper {

        public MyGetHttpServletRequestWrapper(HttpServletRequest request) {
            super(request);
        }

        @Override
        public String getParameter(String name) {            
            String old_value = super.getParameter(name);
            String new_value = null;
            if (old_value != null && !old_value.equals("")) {
                try {
                    new_value = new String(old_value.getBytes("ISO-8859-1"),
                            "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return new_value;
        }

        @Override
        public String[] getParameterValues(String name) {
            String[] old_valueArray = super.getParameterValues(name);
            String[] new_valueArray = null;
            if (old_valueArray != null && old_valueArray.length > 0) {
                new_valueArray = new String[old_valueArray.length];
                for (int i = 0; i < old_valueArray.length; i++) {
                    String tempValue = old_valueArray[i];
                    if (tempValue != null && !tempValue.equals("")) {
                        try {
                            tempValue = new String(tempValue
                                    .getBytes("ISO-8859-1"), "UTF-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                        new_valueArray[i] = tempValue;
                    }
                }
            }
            return new_valueArray;
        }
    
    }



    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String method = request.getMethod();
        if (method.equals("GET")) {
            // GET请求,重写request.getParameter方法。
            request = new MyGetHttpServletRequestWrapper(request);
        } else {
            // struts.i18n.encoding和request.setCharacterEncoding("UTF-8")只针对POST请求有效。有GET请求无效。
            request.setCharacterEncoding("UTF-8");
        }

        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

1 0
原创粉丝点击