好久木扯技术了,话说最近开发颇为曲折,这里决定'忿'笔疾书一番,以做吐槽之用...
1. AJAX跨域
在使用ajax进行前后台交互的时候,经常会遇到到前台js取不到服务器响应数据的情况,这时候也许你已经跨域了。所谓跨域,就是比如当客户端访问www.aa.com的页面,资源时,可能又需要用到www.bb.com的资源,这样的一个情况,就称为跨域访问行为。技术上,因为ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告(禁止)。
跨域的安全限制都是指浏览器端来说的,服务器端是不存在跨域安全限制的。所以针对这2种情况衍生出2类跨域解决方案,一类是服务器端做中转类似代理方式,一类是js处理浏览器端的真正跨域访问。
先说第二种方法,其本质是利用了<script>标签里头的src属性,因为src属性是允许跨域执行的。附上两段简单的代码就能理解了。
第一例:
1. <script LANGUAGE="Javascript"src="" id="get">
2. </script>
3. <script LANGUAGE="Javascript">
4. <!--
5. function get(url)
6. {
7. varobj = document.getElementById("get");
8. obj.src = url;
9. (obj.readStatus == 200)
10. {
11. alert(param);
12. }
13. }
14. function query()
15. {
16. get(get.php);
17. }
18. //-->
19. </script>
20. <BODY>
21. <INPUT TYPE="button"value="CLICK ME" οnclick="query()">
22. </BODY>
23. </HTML>
服务器端代码
1. <?php
2. echo "var param = 'www.achome.cn'";
3. ?>
运行结果:点击button对话框,会显示“www.achome.cn”
第二例:
<script type="text/javascript">function myTest(data) { alert(data); }</script>
<script type="text/javascript"src="http://www.bb.com/index!getData.action?jsoncallback=myTest"></script>
www.bb.com代码如下:
$(param.jsoncallback)({"name": "ZhangHuihua", "QQ": "350863780"})
实际上客户端接收到的response如下:myTest({"name": "Zhang Huihua","QQ": "350863780"})
这里为了方便,还可以使用jquery的一些函数如getJSON()(本人对jquery不是很熟,就不展开了,详情可以参考文末的参考文献),但其本质还是通过src属性实现跨域访问。
这种异步方式又叫做ajaj或者ajax without xmlHttprequest。啰嗦几句:其实AJAX本身应该倡导的是一种异步的思想,我们作为开发者,不应该完全束缚于xmlHttprequest这个模式上面,应该灵活变通,明白ajax本身的技术瓶颈,这才是AJAX的真正内涵,呵呵。
代理服务器的方法就更简单了,说白了就是利用服务器A做中转,让它发送请求给服务器B,C...,收集完数据后再一并返回客户端。这样在客户端这一头实质上只是会去访问服务器A,这样就不会存在跨域的问题了。
2. 吐槽无力的I/O禁用
这里纯粹吐槽一下SAE的I/O禁用,原则上,出于安全考虑,SAE平台禁止开发者在上面调用任何I/O操作,这是无可厚非的。但正因为如此也给开发带来不少麻烦。比如最近用python的第三方库PIL生成图片的时候,因为其中的image类必须在save()时候指定格式才会有某一特定格式的图像数据输出,而save()函数的实现中又涉及到文件I/O的调用。好吧,简单来说,就是没法把image类中生成的图像以某个特定的格式进行传输。呵呵,怎么办呢,yeah,PHP,于是就在中间又穿插一段PHP脚本了...
P.S. php中既然有imagepng(image)这样的以某个格式输出图像数据的函数,python的pil库原则上应该也存在的,比如getdata()就能实现返回图像的像素数据,以三元组的形式形成一个list,只是客户端解析起来要麻烦一点。
3. 反图灵测试
好吧,这段是闲扯,与技术没神马关系。。。最近某人和我提起验证码的事情,所谓验证码,全称其实是全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test totell Computers and Humans Apart,简称CAPTCHA)。是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
想当年,图灵想尽办法,让吾等无法区分一个东西是人还是机器。讽刺的是,现在这个CAPTCHA技术却是费尽心思要让吾等区分一个行为是发自人还是机器。于是,CAPTCHA技术又有了另一个名称------反图灵测试(呵呵,不知图灵君九泉之下做何感想...)
参考资料:
http://wenku.baidu.com/view/35c684868762caaedd33d44b.html
http://wenku.baidu.com/view/e29f37350b4c2e3f57276386.html