浏览 3681 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-19
最后修改:2009-10-19
http://www.iteye.com/topic/336790的帖子,但对其它有所改进。
本文参考了本文介绍解决ajax post中文乱码的问题的方案,如果你的web应用中全部使用utf-8编码,那将不会有这上问题。这里主要是解决那些要求页面编码是gbk或gb2312等非utf-8编码(有时候由于历史遗留问题,就会有这种需求)的web应用遇到的ajax post中文乱码问题。 通常,对于这个问题有三种解决方法: [list] 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服务器没有测试过,如果谁测试了,麻烦也告诉一下结果。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-20
好.谢谢了。以前只知道的第一种方案。
|
|
返回顶楼 | |
发表时间:2009-09-21
ningmenglovesoft 写道 好.谢谢了。以前只知道的第一种方案。
呵呵。。我以前也是只知道第一种,后来遇到问题,项目里面又要求一定不要对前端有太多要求,所以只好去找其它方案 |
|
返回顶楼 | |
发表时间:2010-09-14
|
|
返回顶楼 | |