# session其实并不存在,中国古代调兵遣将的虎符告诉互联网登录的秘密

如何提高技术?如何挣钱?如何同时多任务工作?如何开拓业务?如何维系一个相看两不厌的世俗关系?等等。

技术之路有很多很多,你去看一下GITHUB,可发现技术的路线多得跟米似的,又有一些自己都不会,现在流行什么语言就指什么语言,也就只能指到语言层面了。 很多人就开始绕弯路,学了几年还是没有进展。

其实,编程的技能,不花一定的时间反复练习,没有对路的师父在一旁冷眼旁观、及时棒喝,也很难领悟。有师父指路,少走三五年弯路,人生又有几个三年。

安全性验证 在课程最开始的时候,唐先生就问:我们登录之后的页面,就算不登录,知道网址也可以输入地址访问页面?有没有什么方法避免这个情况。

登录的目的就是避免非授权的访问。

开发环境: VFP SP2 7423 祺佑三层开发框架(猫框)

# 中国古代的虎符

古代虎符 虎符是古代皇帝调兵遣将用的兵符,用青铜或者黄金做成伏虎形状的令牌,劈为两半,其中一半交给将帅,另一半由皇帝保存。只有两个虎符同时合并使用,持符者即获得调兵遣将权。

注意有两半,一半给将帅,一半是帝王。我们BS可以不可这样做,做一个虎符,一半在服务器(S),一半在用户浏览器(B),你访问时,我验证这个虎符是不是符合,符合让你访问

# 登录页面的升级

<form action="login.fsp?proc=login">
	用户名:<input type="text" value="" name="username">
	密码:<input type="password" value="" name="userpwd">
	<input type="hidden" name="ispostback" value="1">
	<input type="submit" value="登录">
</form>
<%=u(cMsg)%>
1
2
3
4
5
6
7
  1. 增加ispostback字段,目的区分首次提交和二次及以上提交
  2. 增加错误信息提示

# vfp后端代码fsp

后端代码

# BS的虎符的实现

BS的虎符叫TOKEN, 为满足多人访问,且可以随时可以让TOKEN失败 我们用Guid来实现

GUID 是永不重复的字符串

  1. 验证用户名和密码服务器,生成一个GUID(token)存入表中,发送给浏览端
  2. 浏览端每次访问要往服务器提交这个GUID(token)
  3. 服务器的去验证这个GUID (token)

方法一

  1. 每次调用一个FSP(WEBPAI),往这个WEBAPI 传参
  2. WEBAPI接收这个参数,验证

方法二

  1. 登录成功之后,服务器获取GUID,存入表中,并写浏览器的COOKIE
  2. 每次调用,服务器读取Cookie 并验证

这就是所谓的Session,有些Session是放在服务器内存,有些放在数据库中,看具体实现了。

# TOKEN 虎符有效期

一个Token 不能每次都能生效,我们必须给这个虎符TOKEN有效期。 验证不单单验证TOKEN是不是正确的,还要看有没有过期。

# 验证的时机 CTL类的init 方法

TOKEN表结构 DAL_TOKEN的设计

DAL代表数据访问类,DAL_TOKEN的类设计只有两个功能 功能一: 生成TOKEN 功能二: 验证TOKEN

生成TOKEN

验证Token

# login.fsp改造

实现一个init 方法,类一旦加载,便会启动这个方法。(类默认方法) 试试效果吧

如果TOKEN 不存在,或者过期,就会出现这样的提示了

假如有班级信息,每个代码都要加上吗? 有很多FSP类, 班级 教师 学校 一个一个加很容易错,而且还容易漏掉。

# 不改动业务层,甚至不写代码的秘密

面向过程的程序员,在使用面向对象的语言,总是习惯把代码复制来得复制去的。觉得代码不就是这样子吗?

就没有想到面向对象就直接提升了一级思维层次。

这招可谓是降维打击!

# 设计父类ctl_public

父类代码

# ctl_ryxx类继承ctl_public

Define Class ctl_ryxx As ctl_public OF ctl_public.prg
1

即可实现继承了,即由原来的session 变成了 ctl_public of 后面是PRG文件名

把原来的ctl_ryxx的中init 注释掉,试试效果吧。

以后新建的每个类都直接继承于ctl_public,即可拥有TOKEN验证的能力了。