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

ajax post请求中文乱码问题解决(不使用escape方法,只使用filter)

阅读更多
注:本文原创,转载请指明出处。欢迎提出宝贵意见和建议。
本人另一篇博客总结了三种方案的比较,并提出了一种比本方案更好的一个方案,请参考:http://hjg1988.iteye.com/blog/472080
    相信很多人都遇到过乱码问题,尤其在使用了一些web框架之后。但是大部分情况下,都是可以通过框架本身提供的配置来设置字符集编码来解决。比如,在webwork中,我们可以通过在webwork.properties中使用这种方法来设置字符编码:
webwork.i18n.encoding=GBK

这时候,只需要使所有页面的charset="GBK"(与webwork的配置保持一致)即可避免大部分乱码问题。但是,如果我们希望使用Ajaxpost请求(使用XmlHttpRequest对象而非隐藏的frame),那么,post的参数在后台中取出的时候依然是乱码(本人在IE和Firefox下测试过)。而如果使用隐藏的frame来做Ajax请求,那么将不会出现这种问题。
    出现这种情况的原因是由于,W3C标准中规定,XmlHttpRequest对象的post请求的编码只能是UTF-8的,这样除非我们将webwork的配置设置为
webwork.i18n.encoding=UTF-8

否则Ajax的post请求编码将不能与框架的编码设置一致,从而导致乱码。当然如果我们所有的页面都使用UTF-8编码,那将不会有问题,但有的时候我们可能希望页面编码是GBK或GB2312的,这时候如果将配置设为UTF-8会导致普通页面乱码。
    Web框架对与编码设置仅仅是保证了在第一次调用request.getParameter()(或getParameterMap()等)之前调用request.setCharacterEncoding()方法来设置编码——即使不使用框架,我们也会这么做。于是有人可能会认为,那只要在发送Ajax post请求时,在请求参数中增加一个参数用来说明这是一个Ajax post请求,这样后台只要先getParameter()取出这个参数作为判断,就然后再调用request.setCharacterEncoding()来设置相应的编码——但这当然不会有效果,因为一旦已经调用过了getParameter()方法,setCharacterEncoding()方法就已经失效了,它必须在所有取得参数的方法之前调用。
    这种方式虽然不能解决问题,但是思路却是很好的。既然不能通过getParameter()方法来判断是否是一个特殊的请求,但是我们可以在请求的url中加入一个参数名称(可以不需要值),然后在后台通过使用request.getQueryString()方法,取得所有请求参数,然后判断是否存在这个参数名称,即可知道是否需要设置编码。当然,这些操作我们必须写在一个servlet的filter里面,并保证这个filter在所有其它filter和web框架的servlet或filter之前被调用即可。下面是笔者写的一个例子(这是我自己的解决方案,说不定大家还有其它更好的方式可以解决,希望指点)。
    当然,有很多人都已经有另一种解决方案了,那就是在前端发送数据之前使用escape函数对要发送的数据进行编码,后台取出后再进行解码就可以获得正确的中文,但是笔者不推荐使用这种方式。这样虽然可以解决问题,但是前端和后台的藕合度比较大——一方面前端需要做工作比较多,需要加入一些与普通操作无关的代码,另一方面需要在后台具体的业务逻辑代码中加入解码的代码,而这些代码实际上与业务逻辑无关,这样的藕合不是很必要。而下面的方法,只需要前端的请求url加入一个可配置(web.xml中配置)的参数名称(类似与一个命令)即可,这种方式有点像命令模式,对解藕有帮助。
package com.hjg.demo;

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;

/**
 * 如果request中含有__ajax__参数,则对其参数的进行编码
 * 
 * @author jinggang.huangjg
 * 
 */
public class RequestEncodingFilter implements Filter {

	/** ajax请求的编码 */
	public final String ajaxEncoding = "utf-8";
	
	private boolean ignore = false;
	
	/** url请求参数中用户标志是否是一个ajax请求的标志名称 */
	private String ajaxFlag = "__ajax__";

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		if(ignore){
			chain.doFilter(request, response);
			return;
		}
		
		HttpServletRequest req = (HttpServletRequest) request;
		
		// 这里不使用getParameter方法,否则会使后续setCharacterEncoding方法失效
		String queryString = req.getQueryString();

		// 如果请求url参数中含有flag(默认为__ajax__),则表明使用ajax请求,则编码设置为utf-8
		if (queryString != null && queryString.indexOf(ajaxFlag) != -1) {
			request.setCharacterEncoding(ajaxEncoding);
			
			// 调用一次getParameter方法,使得在此之后再调用setCharacterEncoding将会无效
			// (web框架会在之后再调用此方法,但是已经失效)
			// 参数不一定为ajaxFlag,可以是任何值
			request.getParameter(ajaxFlag);
		}

		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		String value = filterConfig.getInitParameter("ignore");
		ajaxFlag = filterConfig.getInitParameter("ajaxFlag");
		
		if(ajaxFlag == null){
			ajaxFlag = "__ajax__";
		}
		
		if (value == null){
			ignore = false;
		}else if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes")){
			ignore = true;
		}else{
			ignore = false;
		}
	}

}

然后我们在web.xml中配置:
<filter>
	<filter-name>request-encoding</filter-name>
	<filter-class>com.hjg.demo.RequestEncodingFilter</filter-class>
	<init-param>
	<!-- 这个如果不配置,则默认为__ajax__ -->
		<param-name>ajaxFlag</param-name>
		<param-value>__ajax__</param-value>
	</init-param>
</filter>
...
<filter-mapping>
	<filter-name>request-encoding</filter-name>
	<url-pattern>*.action</url-pattern>
</filter-mapping>

这样,当我们要使用Ajax来post数据时,我们可以使用类似下面这样的请求URL:
demo.action?__ajax__&param=value...

而对于普通的数据提交不需要任何改动,因为普通的表单提交所使用的编码是与页面编码保持一致的。这样Ajax post的乱码问题就可以解决了。
2
0
分享到:
评论

相关推荐

    Ajax中文乱码问题解决方案

    在实际开发中,可以结合使用以上方法来解决Ajax中文乱码问题。例如,可以使用jQuery的`$.ajax`方法,设置`contentType`和`dataType`属性,以及在成功回调函数中处理响应数据: ```javascript $.ajax({ url: 'your-...

    c# ajax post数据乱码解决

    在开发过程中,尤其是在使用C#与ASP.NET进行Web开发时,经常会遇到客户端通过Ajax向服务器端发送Post请求后,服务器端接收到的数据出现乱码的问题。这种情况不仅影响用户体验,也可能会导致程序逻辑出现问题。本文将...

    ajax get请求中文参数乱码解决

    在进行Web开发时,我们经常会遇到Ajax GET请求发送中文参数时出现乱码的问题。这个问题主要源于HTTP协议在处理非ASCII字符时的编码不一致。在本文中,我们将深入探讨这个问题,以及如何通过不同的方法来解决它。 ...

    Ajax中文乱码问题解决方法

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

    JSP中 ajax的get请求的中文乱码问题的解决方法.pdf

    在JSP中,当使用Ajax进行GET请求时,可能会遇到中文乱码的问题。这通常是由于URL编码不匹配或处理不当导致的。以下是一些解决这个问题的关键知识点和步骤: 1. **URL编码问题**: URL编码是一种标准,用于将特殊...

    jquery+asp ajax 中文乱码问题解决文档

    通过上述两种方法,可以有效地解决jQuery + ASP AJAX组合下出现的中文乱码问题,确保数据的正确传输和显示,提高应用的国际化水平和用户体验。无论是选择统一编码为UTF-8,还是通过修改jQuery源代码支持GB2312,...

    ajax提交中文乱码解决方法

    ### AJAX提交中文乱码解决方法 在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过JavaScript发起异步请求,与服务器进行数据交换,从而...

    使用prototype.js发送ajax get请求中文参数乱码解决

    在处理中文参数时,尤其是在使用Ajax的GET请求时,可能会遇到中文乱码的问题。这是因为浏览器、服务器和JavaScript之间的编码处理不一致所导致的。本文将深入探讨这个问题,并提供解决方案。 首先,我们需要了解...

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

    在使用Ajax进行POST提交时,中文字符可能会遇到乱码问题,这是因为数据在传输过程中编码与解码不匹配导致的。Ajax以UTF-8编码发送数据,但服务器端可能使用了不同的字符集(如GB2312)来解析,这就产生了乱码。本文...

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

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

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

    ### AJAX在POST中文时解决乱码的方法 #### 一、问题背景 在使用AJAX进行数据请求时,尤其是在处理中文字符的过程中,经常会遇到一个常见问题:即通过AJAX请求得到的`responseText`中的中文字符出现乱码。这个问题...

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

    第二个示例展示了另一种解决中文乱码问题的方法——使用`data`属性来传递参数。这种方式下,参数作为JSON对象的一部分被传递,而不是作为URL的一部分。这意味着参数不会经过URL编码,因此避免了由URL编码引起的乱码...

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    由于Ajax请求不像传统的表单提交那样可以使用Spring Security的默认配置,因此我们需要特殊处理Ajax登录请求问题。 知识点3:解决方案 为了解决Ajax登录请求问题,我们可以使用Spring Security的 Ajax 登录请求...

    ajax中文乱码如何解决

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

    ajax到servlet乱码解决

    通过使用 `encodeURI()` 函数在 AJAX 客户端编码 URL 参数和使用 `URLDecoder` 类在 Servlet 服务器端解码 URL 参数,我们可以解决 AJAX 到 Servlet 乱码问题。这样,我们的应用程序可以正确地处理中文参数,从而...

    java认证_Ajax中文乱码问题及解决方法.doc

    【Java认证:Ajax中文乱码问题及解决方法】 在Java Web开发中,使用Ajax进行异步数据交互时,经常会遇到中文乱码的问题。这主要涉及到字符编码的处理,特别是当Ajax请求发送的数据包含中文字符时。以下是两种常见的...

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

    通过以上步骤,我们应该能够有效地避免在Struts框架下使用Ajax时出现的中文乱码问题。当然,实际情况可能更为复杂,例如涉及Tomcat服务器或其他中间件的配置,都需要一一排查并适配。对于开发和调试过程中遇到的具体...

    ajax传递中文参数乱码解决办法

    在使用AJAX向服务器发送请求时,如果请求参数中包含中文字符,可能会因为编码方式不一致导致接收方解析出错,从而出现乱码现象。这主要是由于客户端(如浏览器)和服务器端默认采用的字符集可能不同所导致的。 ####...

    Ajax 中文乱码问题

    通过以上介绍的方法,我们可以有效地解决Ajax请求过程中可能出现的中文乱码问题。关键在于确保数据在发送和接收过程中的编码一致性。希望本文能帮助开发者更好地理解和处理这类问题,提升用户体验。

    ajax乱码解决方案

    解决Ajax乱码问题的方法: - **方法一**:在服务器端对请求参数进行重新编码,例如在Java Servlet中,可以先将请求参数从ISO8859-1解码,再用目标编码(如GBK)重新编码。 ```java String string = request....

Global site tag (gtag.js) - Google Analytics