`
yufei
  • 浏览: 94159 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java的AJAX请求中文编码方法

    博客分类:
  • AJAX
阅读更多
这里的方案是页面(page)是基于GBK(gb2312) 的编码格式

AJAX的中文情况,默认情况下,tomcat和weblogic的get和post请求的编码方案都不一样,不过前提都是要设置request.setCharactorEncoding("UTF-8")如下面代码中,get方案是很烦琐的那种将得到的参数重新编码来实现的|new String(request.getParameter("para name").getBytes("encoding name"))|而post方案是比较简单而方便的,也提倡使用这种方式,因为可以基于filter来管理编码
tomcat可以通过设置在server.xml里的Connector元素下设置URIencoding="gbk"参数来让get使用post的方案(即get和post都使用request.setCharactorEncoding("UTF-8"),request.getParameter("para name") )具体设置参考http://www.iteye.com/topic/131542,不过在weblogic下无解(我个人还没发现如何实现),weblogic好像在解析get参数后自己又用什么编码格式包装过......其实AJAX get根本没有普通请求get请求作为标签的作用,我们完全可以不使用get,而只使用post

测试用的jsp和servlet在下面,丢到一个项目里,在web.xml里配置servlet后运行可以看到效果,servlet的url-pattern是这个<url-pattern>/GetAndPostExample</url-pattern>

getAndPostExample.jsp
<%@ page language="java" import="java.util.Date"  contentType="text/html; charset=gbk"%>
<html>
	<head>
		<title>发送带参数的信息到服务器,以及get,post的区别</title>
		<script type="text/javascript">
			var xmlHttp;			
			function show()
				{
				document.getElementById("show").value=document.getElementById("firstName").value;
				}
			function createXMLHttpRequest()
				{
				if (window.ActiveXObject)
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				else if (window.XMLHttpRequest)
					xmlHttp = new XMLhttpRequest();
				}
			
			function createQueryString()
				{
				var firstName = document.getElementById("firstName").value;
				var secondName = document.getElementById("secondName").value;
				var birthday = document.getElementById("birthday").value;
				
				var queryString = "firstName="+firstName+"&secondName="+secondName
												+"&birthday="+birthday;
				return queryString;
				}
			
			function doRequestUsingGET()
				{
				createXMLHttpRequest();
				show();
				var queryString = "GetAndPostExample?";
				queryString = queryString + createQueryString()
										+ "&timeStamep=" + new Date().getTime();
				xmlHttp.onreadystatechange = handleStateChange;
				xmlHttp.open("GET",queryString,true);
                                    xmlHttp.setRequestHeader("RequestType","ajax");
				xmlHttp.send(null);
				//alert(queryString);
				}
				
			function doRequestUsingPOST()
				{
				createXMLHttpRequest();
				show();		
				var url = "GetAndPostExample"
				var queryString = createQueryString()+ "&timeStamp="+ new Date().getTime();			
				xmlHttp.open("POST",url,true);
				xmlHttp.onreadystatechange = handleStateChange;
				xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
                                     //设置报头,说明此请求是ajax请求
                                     xmlHttp.setRequestHeader("RequestType","ajax");
				xmlHttp.send(queryString);
				}
				
			function handleStateChange()
				{
				if (xmlHttp.readyState == 4)
					{
					if (xmlHttp.status == 200)
						parseResults();
					}
				}
			
			function parseResults()
				{
				var responseDiv = document.getElementById("serverResponse");
				if (responseDiv.hasChildNodes())
					{
					responseDiv.removeChild(responseDiv.childNodes[0]);
					}
				var responseText = document.createTextNode(xmlHttp.responseText);
				responseDiv.appendChild(responseText);
				}
			
		</script>
	</head>
	<body>
		<h1>输入你的姓,名,生日日期</h1>
		<br>
		
			<table>
				<tr>
					<td>
						姓:
					</td>
					<td>
						<input type="text" name="firstName" id="firstName" value="羽飞">
					</td>
				</tr>
					<td>
						名:
					</td>
					<td>
						<input type="text" name="secondName" id="secondName" value="翼">
					</td>
				<tr>
				</tr>
				<tr>
					<td>
						生日:
					</td>
					<td>
						<input type="text" name="birthday" id="birthday" value="五月">
					</td>
					<td>
						<input type="text" name="show" id="show">
					</td>
				</tr>
			</table>
		<form action="#">
			<input type="button" value="使用GET提交" onclick="doRequestUsingGET();">
			<br>
			<input type="button" value="使用POST提交" onclick="doRequestUsingPOST();">
		</form>
		<br>
		<br>		
		<h2>服务器返回信息:</h2>		
		<div id="serverResponse">
		</div>
	</body>
</html>


GetAndPostExample.java
package yufei;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GetAndPostExample extends HttpServlet
	{
		protected void processRequest(HttpServletRequest request,
				HttpServletResponse response, String method1)
				throws ServletException,IOException
				{
				//设置文本类型(content type)
				response.setContentType("text/xml");
                                     //设置文本类型的编码格式
				response.setCharacterEncoding("GBK");
				response.setHeader("Cache-Control","no-cache");
				
				String firstName =null;
				String secondName = null;
				String birthday = null;
                                    //无论是get还是post,都要使用下面这句
                                    request.setCharacterEncoding("UTF-8");
				if (method1.equals("GET"))
				{			     
				 firstName = new String(request.getParameter("firstName").getBytes("ISO8859-1"));
				 secondName = new String(request.getParameter("secondName").getBytes("ISO8859-1"));
				 birthday = new String(request.getParameter("birthday").getBytes("ISO8859-1"));
				}
				else if (method1.equals("POST"))
				{				 			 firstName = request.getParameter("firstName");
				 secondName = request.getParameter("secondName");
				 birthday = request.getParameter("birthday");
				}	
				String responseText = "Hello " + firstName + " " + secondName
								+ " 你的生日是 " + birthday + " " + "(method: " + method1 + ")";				
				PrintWriter out = response.getWriter();
				out.println(responseText);
				
				out.close();
				}
		protected void doGet(HttpServletRequest request,
				HttpServletResponse response)
				throws ServletException,IOException
				{
				processRequest(request,response,"GET");
				}
		protected void doPost(HttpServletRequest request,
				HttpServletResponse response)
				throws ServletException,IOException
				{
				processRequest(request,response,"POST");
				}
	}


-
-

当我们的ajax请求只使用post(tomcat下可以实现get和post同样方案)请求时,我们可以使用过滤器来实现其编码设置,就可以把servlet中的request.setCharactorEncoding提出来,去掉servlet里的request.setCharactorEncoding("encoding name"),加入下面的过滤器
根据fins大大的指导,将过滤器重写为可以区分普通请求和ajax请求的样式了(ajax请求中设置了header)

SetCharacterEncodingFilter.java
package yufei;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;

public class CharactorEncodingFilter implements Filter
	{
	public CharactorEncodingFilter()
		{
		super();
		}
	private FilterConfig filterConfig;
	private String ajaxEncoding = "UTF-8";
	private String commonEncoding;
	protected boolean ignore = true;
	public void init(FilterConfig filterConfig) throws ServletException
		{
		this.filterConfig = filterConfig;
		commonEncoding = filterConfig.getInitParameter("CommonRequestEncoding");
		String value = filterConfig.getInitParameter("ignore");
		if (value == null)
			this.ignore = true;
		else if (value.equalsIgnoreCase("true"))
			this.ignore = true;
		else if (value.equalsIgnoreCase("yes"))
			this.ignore = true;
		else
			this.ignore = false;
		}

	public void doFilter(ServletRequest req, ServletResponse res,
		FilterChain filterChain)

		{
		try
			{
			HttpServletRequest request = (HttpServletRequest) req;
			if (ignore || (request.getCharacterEncoding() == null))
				{
				if (request.getHeader("RequestType") != null
					&& request.getHeader("RequestType")
						.equalsIgnoreCase("ajax"))
					{
					request.setCharacterEncoding(ajaxEncoding);
					}
				else if (commonEncoding != null)
					{
					request.setCharacterEncoding(commonEncoding);
					}
				else
					{
					request.setCharacterEncoding("UTF-8");
					}
				}
			filterChain.doFilter(req, res);
			}
		catch (IOException e)
			{
			e.printStackTrace();
			}
		catch (ServletException e)
			{
			e.printStackTrace();
			}
		}
	public void destroy()
		{
		this.commonEncoding = null;
		this.filterConfig = null;
		}
	}


web.xml加入如下过滤器配置
	<filter>
		<filter-name>CharactorEncoding</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
                  <!-- 设置编码格式到initparameter里去 -->
		<init-param>
			<param-name>CommonRequestEncoding</param-name>
			<param-value>GBK</param-value>
		</init-param>		
	</filter>
	<filter-mapping>
		<filter-name>CharactorEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>













分享到:
评论
7 楼 pspwuji 2008-08-26  
这个只能是ajax适用么?如果不是AJAX怎么办呢
6 楼 licj1995 2007-12-02  
请问:
双过滤器是如何实现的.如方便请帮忙,先谢过了
我的邮箱是:xuliyan1900@yahoo.com.cn
5 楼 npsajax 2007-11-14  
非常感谢您的文章,受教
4 楼 yufei 2007-10-15  
谢谢楼上大大的提醒,标题已经改了,楼上设置header的方法我拿去了,本来我是要连同和普通请求共存一起写的,不过发觉有不少问题要探讨,所以临时决定分开发的,不过看来没必要了

最早我是决定使用多传一个参数来区分ajax和普通请求,结果发现request.getParameter()以后再设置request.setCharactorEncoding()就不会正确(tomcat不正确,weblogic正确..)看了下j2ee-api,发现setCharactorEncoding方法的说明有以下一段This method must be called prior to reading request parameters or reading input using getReader(),看来读取header不会有影响?
后来使用了双过滤器解决了问题,不过和设置header比起来麻烦了不少,马上去试验

......
......

测试OK,看来使用request.getHeader()不会影响request.setCharactorEncoding()
编辑了原文,让其可以根据header参数来区分ajax请求和普通请求了
3 楼 fins 2007-10-15  
回楼主 你这不能叫方案 只能叫"解决ajax乱码的基本方法"

所谓方案应该更系统 更周全.

我问个问题, 如果不是用UTF-8的系统怎么办?

正确的"方案"应该是 后台编码过滤器可以自动分析请求是 ajax还是普通请求.
普通请求则使用 web.xml里配置的编码
ajax请求则使用utf-8

判断的方式很多 常见的也是最好的方案是 在ajax请求里设置 header信息
告诉服务器这是一个ajax请求, 服务器在编码前 从header里取得信息 判断后编码
2 楼 yufei 2007-10-15  
UTF-8我出现过乱码....页面里
UTF-8在某些情况还是会有乱码...虽然几率不高...
我用GB18030也出现过乱码(新国标码,可能支持不够吧),页面里
1 楼 mvmouse 2007-10-15  
不用2312,全部页面都用utf8即可

相关推荐

    Ajax中文乱码问题解决方案

    然而,在处理中文字符时,Ajax请求可能会遇到乱码问题,这主要是由于编码格式不一致或者处理不当导致的。本文将深入探讨Ajax中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**...

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

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

    java+ajax处理乱码实例

    总结来说,Java和Ajax处理乱码问题的核心在于设定正确的字符编码,包括请求和响应的编码,以及在解析XML或HTML数据时进行适当的解码。在实际开发中,开发者应始终关注字符编码的统一,以确保数据在传输和处理过程中...

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

    综上所述,解决JSP中Ajax GET请求的中文乱码问题需要从服务器配置、Servlet处理、JSP页面编码和Ajax请求等多个角度综合考虑,并进行相应的调整。通过这些步骤,可以有效地避免并解决中文乱码问题,保证数据传输的...

    java ajax文档

    - **编码与字符集处理**:Ajax默认使用UTF-8编码,但在服务器端处理时需要注意匹配这一设置,否则可能出现乱码。在Servlet中应通过`setCharacterEncoding("UTF-8")`方法进行设置。 - **安全性考量**:虽然Ajax增强...

    ajax提交中文乱码解决方法

    ### AJAX提交中文乱码解决方法 在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新...只有确保客户端和服务端编码方式的一致性,才能有效避免中文乱码问题的发生。

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

    1. 设置请求头编码:在发送Ajax请求时,可以设置`contentType`为`'application/x-www-form-urlencoded; charset=UTF-8'`,确保数据以UTF-8编码发送。 ```javascript $.ajax({ url: 'your-url', type: 'GET', ...

    ajax解决中文乱码(java/jsp)

    在Web开发中,尤其是在使用Java与JSP技术栈进行开发时,经常会遇到的一个问题是:如何处理AJAX请求中的中文字符乱码问题。本篇文章将详细介绍如何通过前端编码处理、后端参数接收以及响应头设置等手段来有效解决这一...

    jQuery中ajax请求后台返回json数据并渲染HTML的方法

    jQuery中的AJAX请求是一种非常常见的前端异步数据交互方式,它的作用是使得页面无需重新加载即可向服务器请求数据,并将数据动态地加载到页面中。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它...

    ajax请求乱码的解决方法(中文乱码)

    Ajax请求中的中文乱码问题主要是由于字符编码不一致导致的。以下是对这个问题的详细解析和解决方案。 首先,我们需要理解字符编码的基本概念。字符编码是用来表示文本字符的一种规则,常见的有ASCII、GBK、UTF-8等...

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

    当我们在Ajax请求中发送中文数据时,如果服务器端没有正确设置接收编码,就会导致乱码。 接着,我们来看看Ajax发送数据的过程。通常,我们使用JavaScript的XMLHttpRequest对象来发送Ajax请求。在发送POST请求时,...

    ajax请求serlvet传送汉字

    默认情况下,Ajax请求的数据是以UTF-8编码的,而Servlet默认的编码可能不是UTF-8,这可能导致汉字传输过程中出现乱码。为了解决这个问题,我们需要在Ajax请求时指定编码方式,并确保Servlet接收时也使用相同的编码。...

    Java端 ajax简单入门例子

    通过open()方法设置请求类型(GET或POST),URL(指向Java Servlet)和是否异步执行。接着,使用send()方法发送请求,参数通常是表单数据。 3. **Java Servlet**:在后端,Servlet接收到Ajax请求后,解析请求参数...

    ajax到servlet乱码解决

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

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

    JSP中的AJAX GET请求的中文乱码问题主要是由于URL编码格式不匹配导致的。以下是一些解决此问题的关键点和步骤: 1. **URL编码格式**: 默认情况下,Tomcat服务器使用ISO-8859-1编码处理URL,这是因为在`server.xml...

    ajax异步请求小结

    解决方法是在服务器端设置字符编码,例如Java中的`request.setCharacterEncoding("utf-8")`。 - **GET请求乱码**: - IE使用GBK编码,其他浏览器使用UTF-8。在服务器端设置编码(如Tomcat的`...

    JQuery发送ajax请求时中文乱码问题解决

    要解决JQuery发送ajax请求时出现的中文乱码问题,需要从两个方面着手:确保Web项目的web.xml配置文件中设置了正确的字符编码过滤器,以及在JSP页面中设置了正确的字符编码,并使用POST方法发送ajax请求。通过这些...

    ajax中文乱码如何解决

    综上所述,解决Ajax中文乱码问题的关键在于确保客户端和服务器之间的一致性,包括请求头的设置、数据编码和解码以及页面本身的编码设置。在实际应用中,尽可能使用UTF-8作为统一编码标准,可以减少许多编码问题。...

Global site tag (gtag.js) - Google Analytics