这里我只截取部分截图,我们看到我们传进来的参数在 POST 请求就是原生的对象,终于得到我想要的东西了,此时此刻我心中大喜!必须得抽根烟祝祝性,额不对...是祝祝兴。于是我们可以拿这个 data 尽情的蹂躏,随意的鞭打,我要把这个 data 对象尽情的践踏!额,不好意思有点激动。回到正题,我们要给 data 穿衣服才对嘛,怎么说着说着就要开始脱衣服了...好的,下面我们开始穿衣服,在这里我以 base64 举例,我对请求的参数进行 base64 编码:
$.ajaxSetup({ beforeSend: function() { console.log(arguments); var params = arguments[1].data; var data = ''; for (var key in params) { //这两行代码的意思是进行 base64 编码 var dataUtf8 = CryptoJS.enc.Utf8.parse(params[key]); var dataBase64 = CryptoJS.enc.Base64.stringify(dataUtf8); data = data.concat('&' + key + '=' + dataBase64); }; arguments[1].data = data.substring(1, data.length);//将序列化后的参数重写 }, processData: false, });
于是乎,我们的请求参数就穿上了一身漂漂亮亮的衣服遨游在互联网的世界里了,因为 jquery 在 GET 方法中会自动把 data 附加在 url 后面,所以将 processData 设置为 false 之后 url 后面会出现 [object object] ,这是 javascript 对象 toString() 过后的结果,也就是说我们的这个方法并不很适合 GET 方法,所以想给数据穿衣服的同学们还是乖乖的使用 POST 方法吧。
讲到这里,发送数据我们解决了,但是接受数据呢?如果接受的数据也是进行加密的话,我们还需要对数据进行解密(说到这里还是得脱衣服[捂脸]),我们继续翻阅 API ,于是我又看到了一个叫做 dataFilter 的东西,老规矩,先看官方解释:
dataFilter
类型:Function
给 Ajax 返回的原始数据的进行预处理的函数。提供 data 和 type 两个参数:data 是 Ajax 返回的原始数据,type 是调用 jQuery.ajax 时提供的 dataType 参数。函数返回的值将由 jQuery 进一步处理。
该函数很简单,就两个参数,arguments[0] 是 ajax 的原始响应数据,也就是 XHR.responseText ,arguments[1] 是 ajax 请求参数中的 dataType ,而这个函数返回的值也就是 success 回调函数中的 responseText,这下就非常好办了,我们先来测试下:
前端代码发送 ajax 请求,后台响应一句 "hello" ,然后我们在 dataFilter 里返回一句 "world"
前端代码:
$.ajaxSetup({ beforeSend: function() { console.log(arguments); var params = arguments[1].data; var data = ''; for (var key in params) { //这两行代码的意思是进行 base64 编码 var dataUtf8 = CryptoJS.enc.Utf8.parse(params[key]); var dataBase64 = CryptoJS.enc.Base64.stringify(dataUtf8); data = data.concat('&' + key + '=' + dataBase64); }; arguments[1].data = data.substring(1, data.length);//将序列化后的参数重写 }, processData: false, dataFilter: function() { console.log(arguments);//这是我的一个习惯,拿到一个函数之后,管他是什么东西,先看看里面有什么参数 return "world"; } }); $.ajax({ url: 'SetupServlet', type: 'POST', dataType: 'text', data: { param1: 'test1', param2: 'test2', }, success: function(responseText) { console.log(responseText); }, });
后台代码(java):
String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); System.out.println("param1: " + param1); System.out.println("param2: " + param2); response.getWriter().write("hello");
后端输出:
前端输出:
看来一切正常,现在我们加密和解密的过程进行一条龙的处理:
前端:
$.ajaxSetup({ beforeSend: function () { var params = arguments[1].data; var data = ''; for (var key in params) { var dataUtf8 = CryptoJS.enc.Utf8.parse(params[key]); var dataBase64 = CryptoJS.enc.Base64.stringify(dataUtf8); data = data.concat('&' + key + '=' + dataBase64); }; arguments[1].data = data.substring(1, data.length); }, processData: false, dataFilter: function () { var result = ''; try { var a = CryptoJS.enc.Base64.parse(arguments[0]); var result = CryptoJS.enc.Utf8.stringify(a); } catch(e) { result = arguments[0]; } finally { return result; } } });
后台: