Ajax发送请求时的编码问题

对于咱们大多数作web开发的人来讲,在不一样编码影响下,每每会出现乱码的问题,以至于最终达不到开发需求。若是发送的请求里不包含非西欧字符,将不会有任何问题;可是一旦包含了非西欧字符的请求参数,问题也就出现了,但也不必定。 javascript

如今有这样一个小demo: html

show.jsp: java

<% @ page contentType="text/html;charset=GBK" language="java" %> web

<%       // 服务器从页面获取用户的name请求参数,在控制台输出 数组

    System.out.println(request.getParameter("name")); 浏览器

%> 缓存

first.html: 服务器

<input type="text" id="test" name="name"><br /> app

<input type="button" value="GET发送" onclick='getSend(document.getElementById("test").value)' /> 异步

<input type="button" value="POST发送" onclick='postSend(document.getElementById("test").value)' />

<script type=javascript>

   // 获取xmlHttpRequest

  var xmlHttp;

  function getXMLHttpRequest()

 {

   if(window.XMLHttpRequest)

  {

     xmlHttp = new XMLHttpRequest();

 }else if(window.ActiveXObject)

  {

    try{

       xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

      }catch(e){

       try{

            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

           }catch(e){ }

   } 

 }

 }

  function postSend(name)

  {

    xmlHttp = getXmlHttpRequest;

   // 服务器请求url

   var uri = "show.jsp";

 // 使用POST方式打开与服务器的链接

  xmlHttp.open("POST",uri,true);    // true----指定使用异步处理

  xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

 // 发送请求

  xmlHttp.send("name="+name);

  }

fucntion getSend(name)

{

  xmlHttp = getXmlHttpRequest;

  var uri = "show.jsp?name="+name;

  xmlHttp.open("GET",uri,true);

  xmlHttp.send(null);

}

</script>

当咱们访问页面提交请求参数后,会在控制台看到,使用GET请求则出现了中文乱码。Ajax请求中,对于POST请求较好处理,异步POST请求参数默认采用UTF-8字符集来编码请求参数,所以只须要调用HttpServletRequest的setCharacterEncoding("utf-8");就能够解决。通常状况下,服务器页面默认采用UTF-8字符集来解码请求参数,因此有时候会看到,即便你没有设置编码字符集,也会看到正确的输出。

可是GET就有所不一样,咱们知道,GET将请求参数和对应的值附加在请求的URL以后。对于中文请求参数值,不会以中文的方式传递参数值,而是转码成URL的格式。因此,应当在服务器页面中做出如下修改:

<%

  if(request.getMethod().equalsIgnoreCase("POST"))

  {

     request.setCharacterEncoding("utf-8");

    System.out.println(request.getParameter("name")); 

  }

 // 处理GET请求

  if(request.getMethod().equalsIgnoreCase("GET"))

  {

     String temp = reqeust.getParameter("name");

// 将参数按ISO-8859-1字符集编码成字节数组,而后按UTF-8字符集将该字节数组解码成字符串

    String new_string = new String(temp.getBytes("ISO-8859-1"),"UTF-8");

   System.out.println(new_string); 

  }

 %> 

这样,或许能够看到正确的GET发送参数的输出,可是当咱们换用IE浏览器发出请求时,将再次出现乱码。GET请求参数所用的字符集与客户端浏览器有关,不一样的浏览器在发送GET请求时使用了不一样的字符集。

因此,咱们只能使用java.net.URLEncoder.encode()方法进行处理:

java.net.URLEncoder.encode(请求参数,"GBK");

而后在服务器端进行相应的转换处理:

new String(请求参数.getBytes("ISO-8859-1"),"GBK");

这样GET发送请求参数乱码问题就解决了。可是,会有至关烦琐的一系列操做,不推荐。

最好是使用POST发送请求参数,理由以下:

1 当请求参数包含的数据太多时,GET请求可能 丢失请求参数

2 当两次GET请求参数相同时,Internet Explorer将直接使用服务器上次的缓存,不会从新发送请求,这对于自动刷新页面至关很差。

相关文章
相关标签/搜索