`
hjg1988
  • 浏览: 69029 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

三种方案解决Ajax post中文乱码问题的比较(包括不使用escape方法)

阅读更多
本文参考了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服务器没有测试过,如果谁测试了,麻烦也告诉一下结果。
    分享到:
    评论
    3 楼 bushkarl 2010-09-14  
    2 楼 hjg1988 2009-09-21  
    ningmenglovesoft 写道
    好.谢谢了。以前只知道的第一种方案。

    呵呵。。我以前也是只知道第一种,后来遇到问题,项目里面又要求一定不要对前端有太多要求,所以只好去找其它方案
    1 楼 ningmenglovesoft 2009-09-20  
    好.谢谢了。以前只知道的第一种方案。

    相关推荐

      Ajax中文乱码问题解决方法

      本文将深入探讨Ajax中文乱码问题的原因及其解决方案。 首先,我们需要理解Ajax乱码的根源。当JavaScript发送HTTP请求时,如果服务器和客户端之间关于字符编码的约定不一致,就会导致乱码。常见的原因包括: 1. **...

      escape --AJAX和JS传中文乱码的最终解决方案

      本文将深入探讨如何使用"escape"函数以及相关的编码策略来解决AJAX和JS传中文乱码的问题。 首先,我们需要理解AJAX(异步JavaScript和XML)的工作原理。AJAX允许网页在不重新加载整个页面的情况下与服务器交换数据...

      Asp中用法JQuery的AJAX提交中文乱码解决方法_.docx

      在Asp中使用JQuery的AJAX提交中文乱码解决方法主要是在客户端使用escape()函数编码中文字符,而在服务器端使用VbsEscape()和VbsUnEscape()函数来编码和解码中文字符。通过这种方法,可以避免中文乱码问题,实现正确...

      ajax中文乱码问题解决方案

      **Ajax中文乱码问题详解与解决方案** 在开发Web应用程序时,尤其是在处理中文字符时,Ajax中文乱码问题是一个常见的困扰。这是因为不同的系统、浏览器、服务器和文件可能使用不同的字符编码,导致数据在传输过程中...

      AJAX中文乱码问题探讨及解决

      AJAX中文问题分为两大类: 1)发送路径中的参数有中文,在服务器段接收参数值是乱码 例如: var url=”a.jsp?name=小李”; xmlHTTP.open (“post”,url,true); 解决办法: 利用javascript的提供的escape()或...

      JQuery的Ajax中Post方法传递中文出现乱码的解决方法

      1.JQuery的Ajax中Post方法传递中文出现乱码的原因:当使用JQuery的Ajax的Post方法在传递中文数据时,可能会出现乱码,这主要是因为在Ajax请求的请求头中没有指定字符集,导致默认使用ISO-8859-1字符集。而ISO-8859-1...

      php+AJAX传送中文会导致乱码的问题的解决方法

      在Web开发中,PHP与AJAX的...当使用AJAX发送POST请求时,如果直接将包含中文字符的变量(如`val`)作为请求参数,可能会因为编码问题导致乱码。例如以下代码: ```javascript http_request.open("POST", url, true); ...

      escape函数解决js中ajax传递中文出现乱码问题

      总结来说,当处理Ajax请求中的中文字符时,使用`escape()`函数可以避免乱码问题。不过,随着技术的发展,现代的JavaScript开发更倾向于使用`encodeURIComponent()`函数,它更全面地处理了各种字符的编码,包括中文...

      jquery ajax传递中文参数乱码问题及解决方法说明

      总的来说,解决`jQuery Ajax`传递中文参数乱码问题的方法包括以下步骤: 1. 确保前端页面的`meta`标签指定正确的字符集,如`&lt;meta charset="UTF-8"&gt;`。 2. 在`$.ajax`调用中,设置`contentType`为`"application/x-...

      Asp中使用JQuery的AJAX提交中文乱码解决方法

      在使用Asp进行Web开发过程中,通过JQuery的AJAX方法提交表单数据时,中文字符很容易出现乱码问题。为了解决这个问题,我们可以使用Asp自带的unescape()和escape()函数来进行编码和解码操作,以此确保数据在客户端与...

      jquery ajax post提交数据乱码

      在使用jQuery的AJAX方法(如$.ajax()或$.post())进行数据提交时,可能会遇到在某些浏览器中数据乱码的问题。这通常与字符编码有关。以下是解决这一问题的一些方法: 1. 统一编码:确保文件编码、数据库编码和网页的...

      ajax以及一些乱码问题

      接下来,我们将分别讨论GET和POST两种请求方式下的乱码问题及解决方案。 1. **GET方式的AJAX请求**: 当使用GET方式发送请求时,参数通常附加在URL后面。例如: ```javascript var get = function(url, b, ...

      用js来解决ajax读取页面乱码

      在讨论解决AJAX读取页面乱码的问题之前,我们先简单回顾一下AJAX技术以及它在Web开发中的作用。 AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。它结合了...

      真正的JQuery.ajax传递中文参数的解决方法

      在未明确指定字符集的情况下,JQuery会使用ISO-8859-1编码,这是一种专门为西欧语言设计的编码格式,不包含中文字符,从而无法正确编码和解码中文字符。 为了解决这个问题,我们需要在发送ajax请求时明确指定字符集...

      jquery中文乱码的多种解决方法

      当使用`dataUrl`方式提交数据时(即通过字符串拼接的方式设置请求体),无论前台使用哪种编码方式(如`encodeURI`、`encodeURIComponent`或`escape`)对中文进行转码,在后台接收到的仍然是乱码。 **解决方法**: -...

    Global site tag (gtag.js) - Google Analytics