基于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 server.xml 中以下为
在处理中文乱码问题时,Gson提供了一种优雅的解决方案。例如,以下代码展示了如何使用Gson将包含中文的Java对象转换为JSON字符串,以及如何从JSON字符串反序列化回对象: ```java import com.google.gson.Gson; ...
### get方式传参中文乱码问题的解决方案 在Web开发中,经常遇到GET请求传递中文参数时出现乱码的问题。这种现象通常出现在不同编码格式之间的转换过程中,导致浏览器或者服务器端解析参数时出现问题。本文将深入...
### POST和GET方法乱码解决方案 #### 前言 在Web开发中,中文乱码问题经常出现。这种现象主要是由于客户端(浏览器)与服务器之间的编码格式不一致导致的。通常情况下,浏览器发送数据时使用预设的编码格式,如UTF-...
### json 中文乱码解决方案 在处理JSON数据时,经常会出现中文乱码的问题,尤其是在不同编码格式间进行转换时更为常见。本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这...
Get中文乱码问题解决方案: 修改Tomcat根目录下conf / server.xml文件,代码如下: 代码如下: ”8080″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”8443″ URIEncoding=”UTF-8″> 但是,...
### vim中文乱码解决方案 #### 一、问题背景与概述 在使用Vim编辑器时,中文乱码问题是一个常见的现象,特别是在Fedora和Ubuntu等Linux发行版中更为突出。本文将详细介绍如何解决Vim中的中文乱码问题,并提供一些...
### 系统中文乱码解决方案 #### 一、引言 在软件开发过程中,中文乱码问题时常出现,尤其在数据库交互与前端展示时更为常见。本文将详细探讨解决中文乱码的方法,包括数据库编码设置、服务器配置、工程编码及程序...
以下是一份详细的步骤和解决方案,旨在帮助你克服这个挑战。 首先,我们需要理解Oracle数据库对字符集的支持。Oracle支持多种字符集,包括支持中文的ZHS16GBK、AL32UTF8等。ZHS16GBK是简体中文的GBK编码,而AL32UTF...
中文乱码解决方案 本文将详细介绍中文乱码问题的解决方案,并对IE6的“以UTF-8发送URL”选项设置对请求页面字符编码的影响进行分析。同时,本文也将讨论Tomcat容器的URI编码设置、浏览器的字符编码设置、过滤器的...
### Java中文乱码解决方案 #### 一、Struts2中的乱码问题及解决方案 在Java Web开发中,尤其是使用Struts2框架时,经常会遇到中文乱码的问题。这些问题的出现通常与字符编码设置不当有关。下面详细介绍几种有效的...
### jsp乱码解决方案 #### 一、引言 在Web开发中,特别是使用Java Server Pages (JSP)进行开发时,字符编码问题是一个经常遇到的技术难题。如果处理不当,很容易导致网页显示乱码,影响用户体验及数据的正确性。...
本文将深入探讨这个问题,并提供解决方案。 一、问题解析 1. GET请求原理:GET请求的参数通常会附加在URL后面,形如`http://example.com?param1=value1¶m2=value2`。浏览器在构建这个URL时,会按照默认的字符...
**Ajax 乱码解决方案** Ajax 乱码问题在开发Web应用程序时经常遇到,尤其是在涉及到不同编码格式时。本文将深入探讨Ajax与字符编码相关的技术细节,并提供几种有效的解决策略。 首先,JavaScript处理字符的方式是...
Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...
一种可行的解决方案是在Tomcat服务器的配置文件`server.xml`中,修改`<Connector>`标签,添加`URIEncoding="UTF-8"`属性。这将强制服务器解析URL时使用UTF-8编码,从而解决GET请求的中文乱码问题。 4. **Tomcat配置...
NULL 博文链接:https://jerry-doit.iteye.com/blog/724436
考虑到不同浏览器可能对URL编码和解码的处理略有差异,测试你的解决方案在各种主流浏览器(如Chrome、Firefox、Safari、Edge等)中的表现,确保在所有环境中都能正常工作。 综上所述,解决JSP中Ajax GET请求的中文...