用户通过在单点登录服务器登陆,登录成功后,单点登录服务器分配给该用户一个ticket。然后单点登录服务器将该ticket做为key,用户名做为value,存储在redis中。通过判断该key是否是有效的来判断该用户会话有效。
后续会有服务通过向单点登录服务器发送一个ticket来验证该ticket是否有效,来判断该用户是否登录了。
但是这样会有个问题,某个用户肯能不停的登录,这样单点登录服务器每次都会将该ticket存储在redis中,虽然该ticket有过期时间,但有可能在短时间内在redis中写入大量的ticket。
不知这个有什么好的解决方法吗?
如果你说的是接口遭到恶性调用的话,就属于DDOS防护方面的了,我的回答也就不适用了。
其实你的问题只要做过这个功能的都会遇到,就是如果判断用户已经登录,说使用cookie和session的肯定是没具体做过,这里涉及的是不同浏览器登录的情况,cookie和session都是没用的。
我当时的做法是在redis中再维护一个关系:用户名-->ticket,这样就可以根据用户名找到之前的ticket,也就可以判断出用户是否重复登录了。
个人先答一下,登陆的时候增加验证码,增加机器登录的难度。这个算一种方法,不知到是否还有其他方法?
登录以后ticket在用户端应该有记录吧 或走session或走cookie 那么退出登录时服务端拿到ticket去清空即可 或者用户重复登录时 服务端也可拿到上一次的ticket 来决定是否销毁 再一种就是以用户id为key value存ticket
短时间内不停的登录,如果是人工操作,大可放心 redis 还不至于撑不住。
如果是 DDoS 攻击,那应该在外侧(路由器、防火墙、HTTP服务器或者你的应用程序)添加防护策略。
在应用程序中,取决于你准备如何定义这样的“异常登录”行为,例如你可以比较短期(你可以自定义时间间隔)内的登录,来源是否一致(比如用户5秒内从地球上10个不同的地方登录),当出发异常登录行为判断后,你可以根据应用的敏感程度,决定如何处置(封号?封IP?搜集证据报警:-)
已经登陆了,为啥你还要让他再登陆呢,逻辑就有问题啊?