如果有多个站点..每个都写一个验证码感觉不太爽,于是想了一个跨域验证码的方案。
1.最开始的想法是在验证码服务端生成图片,但是在前面100个字节加入验证码的文字部分,然后使用的客户端访问这个地址得到一个文件流再读取前面100个字节就得到验证码的文字部分,流的后面就是验证码的图片部分.
之后觉得这样的弊端非常大,客户端站点需要一个页面来处理文件流….
2.第二种方案在服务端验证,在验证码页面附加一个参数code=1234 服务端验证成功就返回一个成功标记。但是问题又来了,比如我另外一个站点访问了验证码url,那么验证码已经改变,这时候code=1234已经不能通过验证了。关于这个验证码的存储,最开始用session,但是这样客户端只能用js 来验证…因为客户端的后台来访问url的话sessionid已经变了,这就有一系列安全问题.于是放弃session,改用文本文件存储..而且配置这个文本文件不允许访问! 但最后还是干脆用数据库存储吧,文本存储还有个并发的问题。访问验证码url 需要加一个全局唯一ID,后来想这个ID应该是sessionID,因为如果客户端网站用固定的guid,如果有多个用户同时访问客户端网站就会出问题.
测试验证码图片url:http://service.ztku.com/service/ValCode.ashx?codeID=xxxxxxxxxx
获取验证码文字url:http://service.ztku.com/service/ValCode.ashx?codeID=xxxxxxxxxx&action=val
其中获取验证码url只能访问一次,需要再次访问不加&action=val的url之后才能获取,并且2次的codeID必须一致