今天给各位分享复古相机推荐的知识,其中也会对佳能a480进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文导读目录:
2、kotlin定时器(后台登陆防刷、防爆破以及正常的登录校验)
西宁公交车扫码支付怎么用不了(西宁公交车扫码支付怎么用的)
复古相机推荐(佳能a480)本文为大家介绍西宁公交车扫码支付怎么用不了(西宁公交车扫码支付怎么用的),下面和小编一起看看详细内容吧。
操作方法:可在第三方支付平台开通公交码功能,区域选择西宁,然后激活公交卡,即可通过绑定的银行卡直接支付。如果无法使用该功能,可能是该地区不支持扫码支付。
佳能a480kotlin定时器(后台登陆防刷防爆破以及正常的登录校验
后台登陆防刷防爆破以及正常的登录校验
前几天项目上需要对一个正常登陆接口,以及忘记密码的接口进行防爆破处理,这里我用nginx,redis,以及前端的一些简单的图形拖动来做一个简单的安全机制,可能有不完善的地方,大家可以提出来意见。其实一个接口是无法完全避免接口爆破的,区分人和机器或许可以使用谷歌的图片验证机制,但是我们一般简单项目没必要做那么复杂的,只需要确保不正常的访问频率不会爆破出我们的用户信息,以及让我们机器的处理流量保存在可控范围即可。验证码只能s获取一次并且小时内只能获取三次,超过次数提升获取频繁,稍后再试。正常登录小时内失败次账号自动锁定,小时之后自动解锁。获取验证码无论输入的账号存在不存在均显示发送成功,但是实际不存在的账号不会正常发送。.登录失败,账号不存在密码错误不再提示账号不存在等等,而是统一显示账号或密码错误。.忘记密码前端部分增加滑动校验,倒计时无法点击发送验证码。前后端共同校验。.技术限制系统此接口的访问频率。前端部分可以在这个地址看看这几个简单的组件,这次我们就使用最简单的,滑动拖动即可。《drag-verify???????ref=“dragVerify“???????:width=“width“???????:height=“height“???????text=“请按住滑块拖动“???????suessText=“验证通过“???????:isPassing.sync=“isPassing“???????background=“#c“???????pletedBg=“rgb(,,)“???????handlerIcon=“el-icon-d-arrow-right“???????suessIcon=“el-icon-circle-check“???????passcallback=“passcallback“?????》?????《/drag-verify》用户滑动之后需要加上s倒计时,这块我们使用定时器实现即可,以及邮箱和手机号的正确性校验,不正确则弹窗提示。this.countDown=;???timer=setInterval(()=》{????if(this.countDown-》=){?????this.countDown-=;????}else{?????clearInterval(timer);?????timer=null;????}???},);《el-buttondisabledtype=“text“v-show=“time》“》{{time》?`${time}`:““}}s之后重试《/el-button》验证邮箱手机号可以使用正则校验进行。mobileReg=/^d{}$/;???emailReg=/^({,})$/;前端大体思路就是,进行滑块验证,拖到右边之后,s之内无法操作,s到期之后自动复原,显示倒计时时间。这个只能防止用户在页面上多次点击,造成一个验证的假象,如果直接对后端接口爆破,则无法避免。这是大概的流程图,图中还有些细节问题下面慢慢讲解。这块本来我想用java或者kotlin写,但是历史项目用go写的,重写的话还有其他一些改动,所以继续使用golang完成这部分逻辑。先定义一个结构体,然后我们来分析下需要哪些字段来实现我们的业务。typemonLoginstruct{??CreateTimetime.Time??LastTime?time.Time??Times???uint}//登录的前置校验funcbeforemonLoginValid(keystring,r*redis.Client,fieldstring)(bool,error){??//redis中是否存在账号??result,err:=r.HExists(field,key).Result()??iferr!=nil{??????fmt.Printf(“从redis中获取用户账户失败,账户为:%s“,key)??????returnfalse,err??}??ifresult{??????login:=&monLogin{}??????//存在账号说明之前登录失败过且自从上次失败未登录成功过??????monLogin,err:=r.HGet(field,key).Result()??????iferr!=nil{??????????returnfalse,err??????}??????json.Unmarshal(byte(monLogin),login)??????iflogin.Times《{??????????returntrue,nil??????}??????//是否在小时内失败了次??????iflogin.Times》={??????????//否??????????iftime.Now().Sub(login.CreateTime)》time.Hour*{??????????????//连续输错次时长大于小时解锁??????????????r.HDel(field,key)??????????????returntrue,nil??????????}else{?复古相机推荐(佳能a480)?????????????fmt.Printf(“用户%s于小时之内连续登录失败次,账号锁定,小时后重试。“,key)??????????????returnfalse,nil??????????}??????}??}??//redis中不存在重试记录??returntrue,nil}在所有的登录判断的出口,调用此方法即可,例如用户名密码错误,acl校验未通过等等。其实原理差不多,唯一的区别就是多了一个获取验证码时间间隔校验。funcbeforeFotPasswordValid(keystring,r*redis.Client,fieldstring)(bool,error){??//redis中是否存在账号??result,err:=r.HExists(field,key).Result()??iferr!=nil{??????fmt.Printf(“从redis中获取用户账户失败,账户为:%s“,key)??????returnfalse,err??}??login:=&monLogin{}??//账号存在??ifresult{??????monLogin,err:=r.HGet(field,key).Result()??????iferr!=nil{??????????returnfalse,err??????}??????json.Unmarshal(byte(monLogin),login)??????//获取验证码间隔时长不能小于s??????iftime.Now().Sub(login.LastTime)《time.Second*{??????????fmt.Printf(“用户获取验证码间隔小于s“)??????????returnfalse,nil??????}??????iflogin.Times《{??????????returntrue,nil??????}??????//是否在小时内获取了次??????iflogin.Times》={??????????//否??????????iftime.Now().Sub(login.CreateTime)》time.Hour*{??????????????//连续输错次时长大于小时解锁??????????????r.HDel(field,key)??????????????returntrue,nil??????????}else{??????????????fmt.Printf(“用户%s于小时之内连续获取验证码次,账号锁定,小时后重试。“,key)??????????????returnfalse,nil??????????}??????}??}??returntrue,nil}//更新获取验证码的时间funcafterFotPasswordValid(keystring,r*redis.Client,fieldstring){??login:=&monLogin{}??monLogin,_:=r.HGet(field,key).Result()??j son.Unmarshal(byte(monLogin),login)??//验证码发送成功??result,_:=r.HExists(field,key).Result()??ifresult{??????login.Times=login.Times+??????login.LastTime=time.Now()??????data,_:=json.Marshal(login)??????r.HSet(field,key,data)??}else{??????login.Times=??????login.LastTime=time.Now()??????login.CreateTime=login.LastTime??????data,_:=json.Marshal(login)??????r.HSet(field,key,data使用jmeter进行压力测试:s个请求,我们预期只有个请求成功,其他的返回.
KotlinRunnable定时器写法
第一种写法varmStartVideoHandler :Handler=Handler()varmStartVideoRunnable:Runnable=object:Runnable{overridefunrun(){mStartVideoHandler.postDelayed(this,)}}第二种:privatelateinitvarrunnalble:Runnableinit{runnalble=Runnable{mStartVideoHandler.postDelayed(runnalble,)}}第三种自己赋值给自己??privatefunmStartVideoRunnable()=mStartVideoRunnable
复古相机推荐的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于佳能a480、复古相机推荐的信息别忘了在本站进行查找喔。