`
IT少年
  • 浏览: 74267 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ajax post或者get 传参时中文问题

阅读更多
既然是ajax传参中文问题,我们第一反应肯定传走的时候把参数编码,后台在解码,
既是 javascript 与 java  两种语言 之间 编码解码 大pk了 ,
先介绍 java 的 解码编码
java中的URLEncoder和URLDecoder类
java  是按照以下进行方式编码的 (注意不会被编码的 不包括‘=’)
/*
1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;
2.将空格转换为加号 (+) ;
3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;
4.在每个 name=value 对之间放置 & 符号。
*/

(下面是不会被编码的)
1.大写字母A-Z
2.小写字母a-z
3.数字 0-9
4.标点符 - _ . ! ~ * ' (和 ,)

       诸如字符: / & ? @ # ; $ + = 和 %也可以被使用,但是它们各有其特殊的用途,如果一个文件名包括了这些字符( / & ? @ # ; $ + = %),这些字符和所有其他字符就应该被编码。


一、URLEncoder(编码类)

     在java1.3和早期版本中,类java.net.URLEncoder包括一个简单的静态方法encode( ), 它对string以如下规则进行编码:
       public static String encode(String s)

     这个方法总是用它所在平台的默认编码形式,所以在不同系统上,它就会产生不同的结果。结果java1.4中,这个方法被另一种方法取代了。该方法要求你自己指定编码形式:

public static String encode(String s, String encoding) throws UnsupportedEncodingException


对于一个字符 String  name="name=天地& pwd=/hello";
编码后    name%3D%CC%EC%B5%D8%26+pwd%3D%2Fhello


特别需要注意的是这个方法编码了符号,“/” ,&,=,和:。它不会尝试着去规定在一个URL中这些字符怎样被使用。由此,所以你不得不分块编码你的URL,而不是把整个URL一次传给这个方法。这是很重要的,因为对类URLEncoder最通常的用法就是查询string,为了和服务器端使用GET方法的程序进行交互。例如,假设你想编码这个查询sting,它用来搜索AltaVista网站:
pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3

这段代码对其进行编码:
String query = URLEncoder.encode( "pg=q&kl=XX&stype=stext&q=+/"Java+I/O/"&search.x=38&search.y=3");System.out.println(query);

不幸的是,得到的输出是:
pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

出现这个问题就是方法URLEncoder.encode( ) 在进行盲目地编码。它不能区分在URL或者查询string中被用到的特殊字符(象前面string中的“=”,和“&”)和确实需要被编码的字符。由此,所以URL需要像下面这样一次只编码一块:



这才是你真正想得到的输出:
pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

同理 在 javascript 中 我们也应该对要传输的中文参数先编码 ,再写到要传输的字符串中

而javascript  编码函数是


encodeURIComponent();
java  对天地 两个字的编码是 %3D%CC%EC%B5%D8;
用javascript 函数编码 后是  %EF%BF%BD%EF%BF%BD%EF%BF%BD

但是用get传值时

浏览器认为%是个转义字符,经过一次编码解码之后再传递给处理页面,这样的话服务器端就得不到正确结果了。所以 我们编码两次 来防止这种情况,(如果是post 解码,编码 就都不用了 )我们可以看到 %被编码成%25了

两次编码后  %25EF%25BF%25BD%25EF%25BF%25BD%25EF%25BF%25BD
我们可以看到 依旧 跟 java 对这个字编码后  的 编码不一样  但是
在后台  却是通过 java 的 Decoder.decode()拿到了想要的汉字 ;(不解中)
分享到:
评论
1 楼 背着家走 2011-12-16  
开完会 我要好好的看一下这篇文章,先支持一下~!

相关推荐

    ajax快速解决参数过长无法提交成功的问题

    在ajax中使用post方法,用常规的参数格式:param1=a1&param2=a2 ,当参数长度过长时,依然提交不成功。比如我们经常这样写一个ajax的post请求: $.ajax({ type: "post", // post or get contentType:"application...

    有关Ajax中get和post的使用问题

    使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new ...

    ajax中data传参的两种方式分析

    本篇文章将详细探讨AJAX中`data`传参的两种主要方式:POST和GET。 1. **POST方式**: POST方式通常用于向服务器提交大量数据或敏感信息,因为POST请求的数据会被包含在请求体中,而不是像GET方式那样显示在URL上。...

    asp.net Core Post Json方式给控制器Action传参并拦截丢失参数等错误信息

    在action的传参上加入FromJsonKey属性即可在传入的json中传入参数,如果传入的json中不存在相应键即报错 [HttpPost] public IActionResult Index([FromJsonKey]int page) { return Json(page); } [HttpPost()]...

    Ajax 对象 包含post和get两种异步传输方式

    同时,为了防止中文乱码问题,在发送和接收数据时都进行了编码和解码处理。 具体来说,GET请求是通过创建一个XMLHttpRequest对象(简称XHR),然后调用xhr.open("GET", url, true)方法初始化一个GET请求,并通过xhr...

    asp.net使用jquery ajax 小例子

    type: "POST", // 或者 "GET" url: "yourHandler.ashx", // 或者 WebMethod 的 URL data: JSON.stringify({ param1: value1, param2: value2 }), // 发送的数据 contentType: "application/json; charset=utf-8...

    Ajax跨域传输参数

    如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和...就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了

    JS与Ajax Get和Post在使用上的区别实例详解

    JavaScript 和 Ajax 中的 GET 与 POST 请求是两种主要的数据传输方式,它们在处理客户端与服务器交互时具有不同的特性和用途。 1. GET 方法: - GET 请求将参数直接附加到 URL(Uniform Resource Locator)上,以...

    在Extjs中使用ajax传参到php中

    要发送一个Ajax请求,你可以创建一个`Ext.Ajax.request`配置对象,指定URL、请求方法(GET或POST)、参数以及回调函数。例如: ```javascript Ext.Ajax.request({ url: 'your_php_script.php', method: 'POST',...

    C# api接口传参.doc

    本篇文章主要介绍了 C# WebApi 接口传参详解,通过 get、post、put、delete 四种请求方式分别谈论基础类型、实体、数组等类型的参数如何传递。 一、get 请求参数传递 get 请求是最常用的请求方式之一,对于取数据...

    jQuery ajax方法传递中文时出现中文乱码的解决方法

    在使用jQuery的AJAX方法进行数据交互时,有时会遇到中文字符乱码的问题。这是因为浏览器、服务器和前端之间编码不一致导致的。本文将详细解释这个问题,并提供有效的解决方案。 首先,我们要理解AJAX(Asynchronous...

    Js+Ajax,Get和Post在使用上的区别小结

    在上述示例中,`funphp100()`函数展示了如何使用Ajax发送GET和POST请求。GET请求直接将参数附加到URL,而POST请求需要设置请求头并使用`send()`发送数据。 总的来说,GET和POST方法在使用上有着明显的区别,开发者...

    如何在Thymeleaf中实现ajax请求url的可靠构造

    在Thymeleaf中构建可靠的Ajax请求URL是Web开发中的一个重要环节,特别是在使用Spring Boot和其他MVC框架时。Thymeleaf是一个强大的服务器端模板引擎,它可以与Ajax结合使用,提供动态更新页面的能力,而无需刷新整个...

    ajax\HTML 页面与页面之间传值

    4. **使用Ajax获取数据**:父页面通过Ajax向服务器发送请求,获取所需数据,然后可以将数据存储在上述的SessionStorage或LocalStorage中,或者嵌入到HTML结构(如隐藏元素)中,供子页面加载后使用。例如: ```...

    ajax与Servlet,传值Demo

    这个“ajax与Servlet,传值Demo”着重展示了如何利用Ajax实现页面局部更新,同时处理Servlet接收到的Ajax传递的数据,包括解决中文乱码问题。 Ajax的核心在于JavaScript,它允许网页在不重新加载整个页面的情况下与...

    Ajax程序经典小例子,《Ajax入门教程》代码

    - `send(data)`:发送请求,data为发送到服务器的数据,GET请求时不需传参。 - `abort()`:取消当前请求。 - `readyState`:请求状态,0为未初始化,1为已打开连接,2为已发送,3为正在接收,4为已完成。 - `status`...

    详解tomcat 解决 POST请求传参数过长受限制的问题

    在开发Web应用时,我们经常会遇到POST请求传参数过长导致的问题。这通常是由于服务器容器,如Tomcat,对POST请求的数据大小进行了限制。本文将深入解析这个问题,并提供解决方案。 问题描述: 在某些业务场景下,...

    Ajax示例,父子窗体传

    - 打开连接:`xhr.open('POST'或'GET', '父窗体URL', true)`,其中`POST`或`GET`是HTTP方法,URL是父窗体的地址。 - 设置请求头,如果是POST请求,需要设置`Content-Type`为`application/x-www-form-urlencoded`。...

    Jquery中ajax方法data参数的用法小结

    - GET与POST请求:在`type`参数设置为`"GET"`时,`data`会附加到`url`后面形成完整的GET请求URL;而`type`为`"POST"`时,`data`则会被放置在请求体中,对于POST请求,服务器通常期望在请求体中接收数据。 - 编码...

    ajax json示例

    4. **前端实现**:使用JavaScript(可能结合jQuery库)编写AJAX请求,设置HTTP方法(GET或POST)、URL、请求头以及JSON格式的参数。 5. **后端处理**:在服务器端(可能是ASP.NET或其他后端框架)接收AJAX请求,...

Global site tag (gtag.js) - Google Analytics