`
starbhhc
  • 浏览: 649495 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

解决Ajax post中文乱码问题的三种方案

    博客分类:
  • AJAX
阅读更多
本文介绍解决ajax post中文乱码的问题的方案,如果你的web应用中全部使用utf-8编码,那将不会有这上问题。这里主要是解决那些要求页面编码是gbk或 gb2312等非utf-8编码(有时候由于历史遗留问题,就会有这种需求)的web应用遇到的ajax post中文乱码问题。
    通常,对于这个问题有三种解决方法:


通过前端页面在ajax post数据时把数据使用encodeURIComponent方法编码两次,后台以utf-8编码取出,使用 java.net.URLDecoder.decode方法解码一次后即可取得正确的数据。----这种方式网上见到的最多,但这样做前端和后台的藕合太大,而且后台加入的这个解码用的代码与业务逻辑无关,却可能要写在业务逻辑的代码里,显示不是个很好的方案。由其对于大的系统来说,必须跟前端和后台的开发人员协调好,否则容易出现问题。
第二种方案,比第一次方案前后台的藕合要小,类似于命令模式。通过一个Filter,根据请求的url中的标记用参数来判断是否要把request的编码设置为UTF-8,可以参考我的另一篇博客:http://hjg1988.iteye.com/admin/blogs/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 any thing");   
        }   
           
        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服务器没有测试过,如果谁测试了,麻烦也告诉一下结果。

分享到:
评论

相关推荐

    Ajax中文乱码问题解决方案

    本文将深入探讨Ajax中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**:服务器与客户端(浏览器)之间使用的字符编码格式不同,例如服务器使用GBK编码,而浏览器使用UTF-8编码...

    c# ajax post数据乱码解决

    本文将详细讲解如何解决C# Ajax Post数据乱码问题。 ### 一、理解问题根源 首先,我们需要了解为什么会出现乱码的情况。这通常是因为客户端和服务器端对于字符编码的理解不一致所导致的。具体来说,如果客户端使用...

    ajax乱码解决方案

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

    ajax提交中文乱码解决方法

    为了解决AJAX提交中文乱码的问题,可以从以下几个方面入手: ##### 1. 客户端编码处理 - **使用`URLEncoder`编码**:在发送请求之前,可以先使用Java的`URLEncoder.encode()`方法将中文字符串进行编码,然后再发送...

    Ajax 中文乱码问题

    本文将详细探讨如何解决Ajax请求过程中的中文乱码问题,并提供具体的解决方案。 #### 二、问题分析 在使用Ajax进行数据传输时,中文乱码问题通常出现在以下两个环节: 1. **发送表单数据时中文乱码**:当通过Ajax...

    Ajax中文乱码问题解决方法

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

    ajax中文乱码如何解决

    在本文中,我们将深入探讨如何解决使用Ajax进行POST请求时出现的中文乱码问题。首先,我们要理解Ajax中文乱码的根源,它通常涉及到字符编码的不一致,尤其是在客户端与服务器之间的通信过程中。 Ajax(Asynchronous...

    ajax提交,后台中文乱码解决

    本文将基于提供的文件信息,详细解析两种解决Ajax提交后台取值中文乱码的方法。 ### 方法一:使用URL编码 在第一个示例中,开发者通过调用`encodeURIComponent()`或`encodeURI()`函数对请求URL中的参数进行编码。...

    ajax到servlet乱码解决

    AJAX 到 Servlet 乱码解决方案 在 Web 开发中,使用 AJAX 通过 URL 传参数给 Servlet 时,经常会遇到乱码问题,即使使用了统一的字符编码也没用。下面我们来探讨这个问题的解决方案。 问题描述 当我们使用 AJAX ...

    Struts框架下Ajax发送中文乱码问题的解决

    总结来说,解决Struts框架下Ajax发送中文乱码问题的关键在于: 1. 确保Ajax请求时设置正确的`Content-Type`,以UTF-8编码发送数据。 2. 在Struts配置文件中配置`CharacterEncodingFilter`或在Action中手动设置请求...

    Ajax使用POST提交中文乱码问题.docx

    对于POST提交的中文乱码问题,解决方案通常涉及到前端的编码和后端的解码: 1. **前端编码**: - 在JavaScript中,使用`encodeURI`或`encodeURIComponent`函数将包含中文的字符串进行编码。需要注意的是,对于POST...

    解决ajax乱码和页面传值问题

    一、解决Ajax乱码问题 Ajax发送和接收数据时,乱码问题主要出现在两个环节:发送请求时的数据编码和服务器返回数据的解码。以下是解决乱码的关键步骤: 1. 数据编码:在发送Ajax请求前,确保你的数据已经正确编码...

    AJAX在Post中文的时候解决乱码的方法

    为了解决AJAX请求中中文乱码的问题,可以通过以下两种方式来进行: 1. **在服务器端设置正确的字符集**: - **PHP**:可以使用`header()`函数来设置响应头中的字符集,例如: ```php header('Content-Type: text...

    ajax解决乱码问题

    本文将深入探讨如何利用AJAX(Asynchronous JavaScript and XML)技术来解决这一常见的乱码问题。 ### 一、理解乱码产生的原因 在Web应用中,乱码问题通常发生在以下几个环节: 1. **表单提交**:当用户在网页上...

    Ajax乱码解决方案

    ### Ajax乱码解决方案 在进行Ajax开发的过程中,经常会遇到数据编码问题导致的乱码现象。这类问题虽然看似简单,但若处理不当,则可能耗费大量时间进行调试与解决。本文将结合一个具体的案例来探讨如何有效地解决...

    Ajax传参是乱码解决方案

    ### Ajax传参是乱码解决方案 在Web开发过程中,数据编码问题经常会导致各种各样的乱码现象出现。尤其是在使用Ajax进行前后端交互时,如果字符编码处理不当,很容易导致前端发送给后端的数据出现乱码。本文将详细...

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

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

    ajax中文乱码问题解决方案

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

    Ajax乱码小结

    在使用Ajax技术进行前后端交互的过程中,常常会遇到字符编码的问题,特别是当涉及到中文或其他非ASCII字符时,容易出现乱码现象。根据题目中的描述,“Ajax乱码:当调用`request.getParameter()`函数时,会自动进行...

Global site tag (gtag.js) - Google Analytics