Ajax发送请求时的编码问题

对于我们大多数做web开发的人来说,在不同编码影响下,往往会出现乱码的问题,以致于最终达不到开发需求。如果发送的请求里不包含非西欧字符,将不会有任何问题;但是一旦包含了非西欧字符的请求参数,问题也就出现了,但也不一定。

现在有这样一个小demo:

show.jsp:

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

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

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

%>

first.html:

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

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

<input type="button" value="POST发送" οnclick='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将直接使用服务器上次的缓存,不会重新发送请求,这对于自动刷新页面相当不好。

转载于:https://my.oschina.net/u/938966/blog/118457

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值