`
futurep_p
  • 浏览: 66106 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

http get 中文乱码解决方案

 
阅读更多

基于spring MVC体系下,本身提供了CharacterEncodingFilter支持,使得大部分情况可以通过此filter来完成字符集转码,但在一种情况下,即在http get方式提交的中文参数无法完成正确的转码,原因是request.setCharacterEncoding(charset)只能完成消息体的内容有作用,而对地址参数中的中文无法完成。

有两种方式可以完成

一、在tomcat的server.xml中配置connector上配置URIEncoding

<Connector port="8080" protocol="HTTP/1.1"   
           connectionTimeout="20000"   
           redirectPort="8443"   
           URIEncoding="UTF-8"  
 />

   注:此方式对外部容器有潜入要求,不太建议使用

二、写一个filter,完成对request中getParameter的包装

public class RequestParameterFilter extends OncePerRequestFilter {
    private static final Logger logger          = LoggerFactory
                                                    .getLogger(RequestParameterFilter.class);

    /** 默认字符集 */
    private static final String DEFAULT_CHARSET = "UTF-8";

    /*
     * (non-Javadoc)
     * @see org.springframework.web.filter.OncePerRequestFilter#doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        // 重新包装请求
        request = new HttpServletRequestWrapper4Query((HttpServletRequest) request);

        filterChain.doFilter(request, response);
    }

    private class HttpServletRequestWrapper4Decode extends HttpServletRequestWrapper {
        private ParameterMapWrapper paramMap;

        /** 构造 */
        public HttpServletRequestWrapper4Decode(HttpServletRequest request) {
            super(request);
        }

        /*
         * (non-Javadoc)
         * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
         */
        @Override
        public String getParameter(String name) {
            return decode(super.getParameter(name));
        }

        public String[] getParameterValues(String name) {
            return decode(super.getParameterValues(name));
        }

        /*
         * (non-Javadoc)
         * @see javax.servlet.ServletRequestWrapper#getParameterMap()
         */
        @Override
        public Map getParameterMap() {
            if (paramMap == null) {
                paramMap = new ParameterMapWrapper(super.getParameterMap());
            }

            return paramMap;
        }
    }

    /**
     * 该此继承自HashMap。
     * @see HashMap
     */
    @SuppressWarnings({ "serial" })
    private class ParameterMapWrapper extends HashMap {
        private Set entrySet;

        /** 构造 */
        public ParameterMapWrapper(Map map) {
            super(map);
        }

        /*
         * (non-Javadoc)
         * @see java.util.HashMap#entrySet()
         */
        @Override
        public Set entrySet() {
            if (entrySet == null) {
                entrySet = new HashSet();
                Set temSet = super.entrySet();
                for (Iterator iterator = temSet.iterator(); iterator.hasNext();) {
                    Map.Entry me = (Map.Entry) iterator.next();
                    EntryWarper entry = new EntryWarper(me);
                    entrySet.add(entry);
                }
            }
            return entrySet;
        }

        /*
         * (non-Javadoc)
         * @see java.util.HashMap#get(java.lang.Object)
         */
        @Override
        public Object get(Object key) {
            Object value = super.get(key);
            if (value != null) {
                return decode(value);
            }
            return null;
        }
    }

    /**
     * entry包装
     * @see Map.Entry
     */
    private class EntryWarper<K, V> implements Map.Entry<K, V> {
        private Map.Entry me;

        /** 构造 */
        public EntryWarper(Map.Entry me) {
            if (me == null) {
                throw new IllegalArgumentException("Map.Entiry argument not null.");
            }
            this.me = me;
        }

        /*
         * (non-Javadoc)
         * @see java.util.Map.Entry#getKey()
         */
        @Override
        public K getKey() {
            return (K) me.getKey();
        }

        /*
         * (non-Javadoc)
         * @see java.util.Map.Entry#getValue()
         */
        @Override
        public V getValue() {
            return (V) decode(me.getValue());
        }

        /*
         * (non-Javadoc)
         * @see java.util.Map.Entry#setValue(java.lang.Object)
         */
        @Override
        public V setValue(V value) {
            return (V) me.setValue(value);
        }
    }

    /**
     * decode处理
     * @param value 需要处理的参数。
     * @return 处理后的值。
     */
    protected Object decode(Object value) {
        if (value instanceof String[]) {
            return decode((String[]) value);
        }
        if (value instanceof String) {
            return decode((String) value);
        }
        return value;
    }

    /**
     * 字符串处理
     * @param value
     * @return
     */
    protected String decode(String value) {
        if (StringUtil.isNotBlank(value)) {
            try {
                return URLDecoder.decode(value, DEFAULT_CHARSET);
            } catch (UnsupportedEncodingException e) {
                logger.error("URLDecode异常", e);
                // 忽略
            }
        }
        return value;
    }

    /**
     * 数组处理
     * @param values
     * @return 
     */
    protected String[] decode(String[] values) {
        if (values != null && values.length > 0) {
            int len = values.length;
            for (int i = 0; i < len; i++) {
                values[i] = decode(values[i]);
            }
        }

        return values;
    }

}

 

 

分享到:
评论

相关推荐

    tomcat get提交中文乱码解决方案

    tomcat get提交中文乱码解决方案,修改tomcat server.xml 中以下为

    Json操作及中文乱码解决方案

    在处理中文乱码问题时,Gson提供了一种优雅的解决方案。例如,以下代码展示了如何使用Gson将包含中文的Java对象转换为JSON字符串,以及如何从JSON字符串反序列化回对象: ```java import com.google.gson.Gson; ...

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

    ### get方式传参中文乱码问题的解决方案 在Web开发中,经常遇到GET请求传递中文参数时出现乱码的问题。这种现象通常出现在不同编码格式之间的转换过程中,导致浏览器或者服务器端解析参数时出现问题。本文将深入...

    POST和GET方法乱码解决方案.docx

    ### POST和GET方法乱码解决方案 #### 前言 在Web开发中,中文乱码问题经常出现。这种现象主要是由于客户端(浏览器)与服务器之间的编码格式不一致导致的。通常情况下,浏览器发送数据时使用预设的编码格式,如UTF-...

    json 中文乱码解决方案

    ### json 中文乱码解决方案 在处理JSON数据时,经常会出现中文乱码的问题,尤其是在不同编码格式间进行转换时更为常见。本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这...

    Get中文乱码IE浏览器Get中文乱码解决方案

    Get中文乱码问题解决方案: 修改Tomcat根目录下conf / server.xml文件,代码如下: 代码如下: ”8080″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”8443″ URIEncoding=”UTF-8″&gt; 但是,...

    vim中文乱码解决方案

    ### vim中文乱码解决方案 #### 一、问题背景与概述 在使用Vim编辑器时,中文乱码问题是一个常见的现象,特别是在Fedora和Ubuntu等Linux发行版中更为突出。本文将详细介绍如何解决Vim中的中文乱码问题,并提供一些...

    系统中文乱码解决方案

    ### 系统中文乱码解决方案 #### 一、引言 在软件开发过程中,中文乱码问题时常出现,尤其在数据库交互与前端展示时更为常见。本文将详细探讨解决中文乱码的方法,包括数据库编码设置、服务器配置、工程编码及程序...

    Linux上安装Oracle汉字乱码完整解决方案_javacn

    以下是一份详细的步骤和解决方案,旨在帮助你克服这个挑战。 首先,我们需要理解Oracle数据库对字符集的支持。Oracle支持多种字符集,包括支持中文的ZHS16GBK、AL32UTF8等。ZHS16GBK是简体中文的GBK编码,而AL32UTF...

    中文乱码解决方案.pdf

    中文乱码解决方案 本文将详细介绍中文乱码问题的解决方案,并对IE6的“以UTF-8发送URL”选项设置对请求页面字符编码的影响进行分析。同时,本文也将讨论Tomcat容器的URI编码设置、浏览器的字符编码设置、过滤器的...

    java中文乱码解决方案

    ### Java中文乱码解决方案 #### 一、Struts2中的乱码问题及解决方案 在Java Web开发中,尤其是使用Struts2框架时,经常会遇到中文乱码的问题。这些问题的出现通常与字符编码设置不当有关。下面详细介绍几种有效的...

    jsp乱码解决方案 本方案解决了jsp常见的乱码问题

    ### jsp乱码解决方案 #### 一、引言 在Web开发中,特别是使用Java Server Pages (JSP)进行开发时,字符编码问题是一个经常遇到的技术难题。如果处理不当,很容易导致网页显示乱码,影响用户体验及数据的正确性。...

    SpringMVC解决GET请求时中文乱码的问题.rar

    本文将深入探讨这个问题,并提供解决方案。 一、问题解析 1. GET请求原理:GET请求的参数通常会附加在URL后面,形如`http://example.com?param1=value1&param2=value2`。浏览器在构建这个URL时,会按照默认的字符...

    ajax乱码解决方案

    **Ajax 乱码解决方案** Ajax 乱码问题在开发Web应用程序时经常遇到,尤其是在涉及到不同编码格式时。本文将深入探讨Ajax与字符编码相关的技术细节,并提供几种有效的解决策略。 首先,JavaScript处理字符的方式是...

    Tomcat和weblogic中文乱码问题解决方案

    Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...

    Struts2中文乱码问题最终解决方案

    一种可行的解决方案是在Tomcat服务器的配置文件`server.xml`中,修改`&lt;Connector&gt;`标签,添加`URIEncoding="UTF-8"`属性。这将强制服务器解析URL时使用UTF-8编码,从而解决GET请求的中文乱码问题。 4. **Tomcat配置...

    cas 中文 服务器端、客户端 乱码解决方案

    NULL 博文链接:https://jerry-doit.iteye.com/blog/724436

    JSP中 ajax的get请求的中文乱码问题的解决方法.pdf

    考虑到不同浏览器可能对URL编码和解码的处理略有差异,测试你的解决方案在各种主流浏览器(如Chrome、Firefox、Safari、Edge等)中的表现,确保在所有环境中都能正常工作。 综上所述,解决JSP中Ajax GET请求的中文...

Global site tag (gtag.js) - Google Analytics