Ajax通过POST方法发送中文信息乱码解决

开发项目用Ajax的Post方法提交信息到请求的servlet,输出遇到中文乱码,纠结了好几天,总结了网络上很多高手的心得,用了两步解决了乱码:

  1. 在JS端,对提交的字符串进行两次编码:
    Js代码   收藏代码
    1. <%@page contentType="text/html" pageEncoding="gbk"%>  
    2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
    3.     "http://www.w3.org/TR/html4/loose.dtd">  
    4.   
    5. <html>  
    6.     <head>  
    7.         <meta http-equiv="Content-Type" content="text/html; charset=gbk">  
    8.         <title>JSP Page</title>  
    9.   
    10.         <script type="text/javascript">  
    11.             var req;  
    12.             function validate() {  
    13.                 //获取表单提交的内容  
    14.                 var idField = document.getElementById("userName").value;  
    15.                 //要发送的字符串数据  
    16.                 var content = "id=hello&message=" + idField + "&say=我是帅哥";  
    17.                   
    18.                 //重点:对content含中文字符的字符串进行两次编码  
    19.                 content = encodeURI(content);  
    20.                 content = encodeURI(content);  
    21.                 var url = "validate.do";  
    22.                 //创建一个XMLHttpRequest对象req  
    23.                 if(window.XMLHttpRequest) {  
    24.                     //IE7, Firefox, Opera支持  
    25.                     req = new XMLHttpRequest();  
    26.                 }else if(window.ActiveXObject) {  
    27.                     //IE5,IE6支持  
    28.                     req = new ActiveXObject("Microsoft.XMLHTTP");  
    29.                 }  
    30.   
    31.                 req.open("post", url, true);  
    32.                 req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
    33.                 req.onreadystatechange = callback;  
    34.                 //send函数发送请求,参数  
    35.                 req.send(content);  
    36.             }  
    37.   
    38.             function callback() {  
    39.                 //alert(req.readyState);  
    40.                 //alert(req.status);  
    41.                 if(req.readyState == 4 && req.status == 200) {  
    42.                     //alert(req.status);  
    43.                     //alert(req.responseText);  
    44.                     var check = req.responseText;  
    45.                     show (check);  
    46.                 }  
    47.             }  
    48.   
    49.             function show(str) {  
    50.                 document.getElementById("info").innerHTML = str;  
    51.             }  
    52.         </script>  
    53.     </head>  
    54.     <body>  
    55.         <h1>Test Ajax</h1><p>  
    56.         <form action="" method="get" name="form">  
    57.             <br>  
    58.             输入用户名:  
    59.             <input type="text" size="10" maxlength="8" id="userName" name="name" οnblur="validate()">  
    60.             <span id="info"></span>  
    61.             <br>  
    62.             输入商品名:  
    63.             <input type="submit" name="refer" >  
    64.         </form>  
    65.     </body>  
    66. </html>  
     
  2. 在servlet端,对接收的数据的进行一次解码:
    Java代码   收藏代码
    1. package com.model;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5. import java.util.Enumeration;  
    6. import javax.servlet.ServletException;  
    7. import javax.servlet.http.HttpServlet;  
    8. import javax.servlet.http.HttpServletRequest;  
    9. import javax.servlet.http.HttpServletResponse;  
    10. import java.net.URLDecoder;  
    11.   
    12. /** 
    13.  * 
    14.  * @author Gavin 
    15.  */  
    16. public class DoAjaxServlet extends HttpServlet {  
    17.      
    18.     protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
    19.     throws ServletException, IOException {  
    20.         response.setContentType("text/html;charset=gbk");  
    21.         request.setCharacterEncoding("gbk");  
    22.         PrintWriter out = response.getWriter();  
    23.         try {  
    24.             response.setHeader("Cache-Control""no-store");  
    25.             response.setHeader("Pragma""no-cache");  
    26.             response.setDateHeader("Expires"0);  
    27.             //这里有个小问题:如果写成String put = null;将会输出一个null后面再加上增加的字符  
    28.             String put = "";  
    29.             for(Enumeration<String> e = request.getParameterNames(); e.hasMoreElements(); ) {  
    30.                 String h = (String) e.nextElement();  
    31.                 String c = (String)request.getParameter(h);  
    32.                 put += c;  
    33.                   
    34.             }  
    35.             //重点在这里,对接受到的信息进行解码  
    36.             String putDecoded = java.net.URLDecoder.decode(put,"utf-8");  
    37.             System.out.println(pute);  
    38.             out.write("message is:" + putDecoded);  
    39.         } finally {   
    40.             out.close();  
    41.         }  
    42.     }   
    43.   
    44.     @Override  
    45.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
    46.     throws ServletException, IOException {  
    47.         processRequest(request, response);  
    48.     }   
    49.   
    50.     @Override  
    51.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
    52.     throws ServletException, IOException {  
    53.         processRequest(request, response);  
    54.     }  
    55.   
    56.     @Override  
    57.     public String getServletInfo() {  
    58.         return "Short description";  
    59.     }// </editor-fold>  
    60.   
    61. }  
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值