1. 程序描述:
用户通过登录页面向服务器提交登录信息,如果在一定时间内,用户提交登录请求次数超过限制,则登录页面出现验证码,并要求用户一并输入才能正确登录。
2. 程序面向问题:
针对电脑程序利用其高速性模拟真实用户向服务其恶意提交请求,对服务器造成危害问题。
3. 解决要点:
1. 用户识别:判别访问同一接口的两个用户是否是同一个用户;
2. 访问频率控制:判断频率超限的策略。
4. 要点解决方案:
1.用户识别:利用ip + sessionId + uri组合的形式来标识同一接口的两次请求是否是同一客户端用户。选用ip + sessionId + uri组合的原因是,如果只采用sessionId,那么假使电脑模拟用户提交程序每次请求的时候都不携带sessionId,到服务器端,那么在服务器端看来每一次请求的是新请求,来自不同的用户,显然此种方式达不到判断用户是否以访问过服务的目的。如果只采用ip来标识也会存在问题,当服务器程序挂到了互联网上,如果有来自在相同网络但是不在服务器程序所在网络的用户群访问时,服务器会将用户群识别为同一用户,显然这不是想要的效果。另外,一个服务器程序上有不同的服务对应不同的uri,访问频率是针对指定接口的,所以uri必不可少。以上就是选取ip + sessionId + uri组合的原因。
2.访问频率控制:用定长队列的思想来控制,具体方案如下:初始化一个存放访问时间的队列,容量为限制的次数。 1)、若当前访问时间入队后队列未满,则本次访问时间可以正常入队,访问频率未超过限制; 2)、若当前访问时间入队后队列刚好达到容量,则本次访问时间可以正常入队,此时若用入队后的队尾元素的值减去队首元素的值的值小于限制的时间,则频率超限制,否则频率不超限; 3)、若当前访问时间入队后队列元素个数超过容量大小,则在本次访问时间入队前先将队首元素出队,之后对频率的判别方式如条目2)的判别方式,即,用队尾元素值减去队首元素值。
5. 实现过程:
采用面向切片编程的思想来实现。在每次接口请求执行完成后用spring AOP 给这个过程的末尾植入切片,对访问频率和验证码进行校验。如果在接口请求中用户数据都通过验证,则在切片中先对验证码进行校验,如若验证码验证通过则本次请求合法且提交的信息都正确,服务器端向客户端发送信号,允许用户进行接下来的操作; 如果验证码验证不通过,用户输入信息有误,接下来对访问频率验证,访问频率没有超过限制则本次访问合法,向客户端返回信息错误信号,要求用户从新登录;如果验证码验证不通过,且访问频率超过限制,则向客户端发送获取验证码并从新登录信号。如果接口请求中的用户数据验证不通过,则切片中直接队用户访问频率校验,然后向客户端用户发送相关校验信号。
6. 程序评估:
1.程序面向restful api型前后端服务:后端对合法性和业务逻辑进行处理,前端根据后端处理完成后返回的数据进行显示、跳转或者发出其他后端服务调用请求。
7. 其他技术:
1.验证码生成和调用;
2.Spring MVC。
8. 编写总结:
1. 编写过程是一个逐渐完善的过程,学到了很多东西:
1.基本demo成型,完成了验证码编写和调用方式的学习;
2.程序介绍,组员评价发现验证码生成策略有问题,验证码服务应该由单独的接口提供,这样刷新验证码操作将更加灵活;
3.程序完善和总结,对整个编写流程和技术有一个概括式的了解,再一次复习关键问题所在和解决方案。
编写前没有对程序实现策略和编写过程存在的进行详细分析和预测,导致编写效率低下,这一点
是需要改进的。
9. 代码地址:http://download.youkuaiyun.com/detail/yangbo2921946188/9457895