验证码开发的碎碎念

好久木扯技术了,话说最近开发颇为曲折,这里决定'忿'笔疾书一番,以做吐槽之用...

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禁用

        这里纯粹吐槽一下SAEI/O禁用,原则上,出于安全考虑,SAE平台禁止开发者在上面调用任何I/O操作,这是无可厚非的。但正因为如此也给开发带来不少麻烦。比如最近用python的第三方库PIL生成图片的时候,因为其中的image类必须在save()时候指定格式才会有某一特定格式的图像数据输出,而save()函数的实现中又涉及到文件I/O的调用。好吧,简单来说,就是没法把image类中生成的图像以某个特定的格式进行传输。呵呵,怎么办呢,yeahPHP,于是就在中间又穿插一段PHP脚本了...

        P.S. php中既然有imagepng(image)这样的以某个格式输出图像数据的函数,pythonpil库原则上应该也存在的,比如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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值