本文参考了http://www.iteye.com/topic/336790的帖子,但对其它有所改进。
本文介绍解决ajax post中文乱码的问题的方案,如果你的web应用中全部使用utf-8编码,那将不会有这上问题。这里主要是解决那些要求页面编码是gbk或gb2312等非utf-8编码(有时候由于历史遗留问题,就会有这种需求)的web应用遇到的ajax post中文乱码问题。
通常,对于这个问题有三种解决方法:
[list]
通过前端页面在ajax post数据时把数据使用encodeURIComponent方法编码两次,后台以utf-8编码取出,使用java.net.URLDecoder.decode方法解码一次后即可取得正确的数据。----这种方式网上见到的最多,但这样做前端和后台的藕合太大,而且后台加入的这个解码用的代码与业务逻辑无关,却可能要写在业务逻辑的代码里,显然不是个很好的方案。由其对于大的系统来说,必须跟前端和后台的开发人员协调好,否则容易出现问题。
第二种方案,比第一次方案前后台的藕合要小,类似于命令模式。通过一个Filter,根据请求的url中的标记用参数来判断是否要把request的编码设置为UTF-8,可以参考我的另一篇博客:http://hjg1988.iteye.com/blog/467715。----这个方案是通过前台向后台发出一条命令来告诉后台对编码进行处理,对前台的要求降低了。注意其中后台是通过request.getQueryString方法而不是getParameter方法来判断是否含有标记。
第三种方案就是我要介绍的方案,与第二种相同,主要问题就是如何让后台知道这是一个ajax post请求,而不是普通的请求。之前因为不知道如何在后台知道前台发来的请求是ajax post的,所以要求前台发出一个命令。而这个方案是我在看到了http://www.iteye.com/topic/336790这个帖子后才知道还有这种方式可以知道是否是一个ajax post请求。下面是我修改过后的方案:
这是一个Filter:
package com.hjg.demo.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 针对ajax post请求进行编码设置,因为Ajax post请求总是UTF-8的,<br />
* 这有可能与应用程序的整体编码设置不一致(由需求决定,比如所有页面<br />
* 统一使用GBK),所以如果不加处理可能会造成中文乱码。<br />
* 这个Filter不对应用程序的整体编码进行过滤,即不会影响整体编码设置<br />
* (Web框架会对编码进行设置),只需要把这个Filter配置在所有Filter之前<br />
*
* @author jinggang.huangjg
*
*/
public class AjaxPostEncodingFilter implements Filter {
/** ajax post请求的默认content type */
public static final String AJAX_POST_CONTENT_TYPE_DEFAULT = "application/x-www-form-urlencoded";
/** ajax post请求的编码,W3C标准为UTF-8 */
public static final String AJAX_POST_ENCODE = "UTF-8";
private String ajaxPostContentType;
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
String requestedWith = request.getHeader("x-requested-with");
String contentType = request.getContentType();
// 表明是一个Ajax的post请求,并且不是使用隐藏的iframe实现的
if("XMLHttpRequest".equalsIgnoreCase(requestedWith) && null != contentType
&& contentType.toLowerCase().startsWith(ajaxPostContentType.toLowerCase())){
request.setCharacterEncoding(AJAX_POST_ENCODE);
/*
* 调用getParameter方法可以让在此之后调用的setCharacterEncoding方法失效,
* 参数可以为任何值(can be any thing)
* 可以防止WEB框架或用户程序再次将其设置回GBK等其它编码,
* 因为有些情况下,用户的要求的页面编码不是UTF-8而是GBK或其它的
*/
request.getParameter("can be anything");
}
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) throws ServletException {
ajaxPostContentType = filterConfig.getInitParameter("ajaxPostContentType");
if(null == ajaxPostContentType){
ajaxPostContentType = AJAX_POST_CONTENT_TYPE_DEFAULT;
}
}
public void destroy() {
}
}
这是web.xml的配置:
<filter>
<filter-name>ajax-post-encoding</filter-name>
<filter-class>com.hjg.demo.filter.AjaxPostEncodingFilter</filter-class>
<!--
以下配置可以省略,ajaxPostContentType默认为application/x-www-form-urlencoded,
除非你的ajax post请求设置了不同的contentType
-->
<!--
<init-param>
<param-name>ajaxPostContentType</param-name>
<param-value>application/x-www-form-urlencoded</param-value>
</init-param>
-->
</filter>
这个方案就对前端没有任何要求,在使用ajax post数据时,不需要做任何处理(当然,前提是你要把contentType设置为application/x-www-form-urlencoded——不过在ajax post数据时本身就应该有这个要求)。
[/list]
第三种方案本人在IE7,Firefox和tomcat6下测试通过,其它浏览器和web服务器没有测试过,如果谁测试了,麻烦也告诉一下结果。
分享到:
- 2009-09-19 16:05
- 浏览 4819
- 评论(3)
- 论坛回复 / 浏览 (3 / 3647)
- 查看更多
相关推荐
Ajax中文乱码问题解决方案
今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们。我的开发环境:XP, eclipse,使用GB18030编码。 当遇到这个问题时,到网上去查了好多文章,提到几种解决方案,如:全站UTF-8编码;请求头...
ajax乱码问题.ajax乱码问题的一些解决方案,总结网友的一些方法。
Ajax 中文乱码问题 Ajax 中文乱码问题 Ajax 中文乱码问题
ajax提交时,后台接收的参数出现中文乱码的解决方法,
解决ajax异步提交后台取值中文乱码问题,提供两种解决方法
Ajax使用POST提交中文乱码问题.docx
jquery+asp ajax 中文乱码问题解决文档
java认证_Ajax中文乱码问题及解决方法.doc
需要对webconfig修改,主要是要修改页面编码格式为utf-8
这个是解决AJAX和JS传中文乱码的最终解决方案 如果你在用AJAX和JS过程中遇到这个问题就可以这样解决 不管你是什么GBK 或者UTF-8或者其他的编码,放上这个代码都是可以解决的
主要解决在ajax中中文参数传递过程中,服务器接收到中文乱码的问题
ajax乱码ajax乱码ajax乱码ajax乱码ajax乱码ajax乱码ajax乱码ajax乱码ajax乱码ajax乱码
基于jsp后台java解决ajax异步传输中文乱码问题.
解决ajax乱码和页面传值问题,很深入啊
Ajax解决乱码问题
struts中文乱码问题解决详细步骤(两种方法)
NULL 博文链接:https://zmx.iteye.com/blog/643075
简单整理的乱码处理方案,jquery的ajax解决UTF-8以及GBK的问题