我相信有很多IT者都会遇到公司要求网站可以实现自动登录,那什么是自动登录呢?
所谓自动登陆就是当用户第一次访问网站时,输入用户名和密码,然后勾选了自动登陆复选框,进入首页后,点击退出登陆,关闭网页,再次打开同样的网站,则无需再次输入账号密码,直接进入首页,这种交互方式就是“自动登录”,这是非常好的用户体验,但是具体怎么实现这些功能呢,下面给大家介绍一下我的理解和实现方式。
大家用过京东和淘宝的想必都知道,登陆京东后,发现账户信息已经显示在首页,可以直接进行购物和付款,这种体验就是我们要追求的方式。
为何浏览器打开,网站就会自动登陆呢,那说明打开网站的时候,浏览器向服务器端发送了一个凭证(Token也可叫钥匙),告诉服务器,我是你的真实用户,可放心开门,既然浏览器端需要提供凭证,那我们肯定会想到Cookie,只有Cookie才能在客户端永久保存,客户端从Cookie中提取信息后,服务器端识别后才能知道真伪,那说明服务器端是需要核验的。
到此,我们的思路已经出来了,要实现自动登陆:
1.用户登陆网站时,选择“N周内免登录”。
2.用户登陆成功后需要在浏览器端保存Cookie信息,同时服务器端数据库中也需要记录同样的信息。
3.当用户访问时,读取客户端中cookie信息,到服务器端数据库进行核验,信息一致时直接获取用户信息保存session,跳转到首页。
以上是我帮助大家分析的思路,那下面我们就会具体去讲这些方案。
既然是cookie实现,那么cookie一定可以被伪造的,所以上述的方案有以下安全隐患:
1.修改用户名,这样就可以随便用其他人的账号登录了;
2.修改cookie的有效期,这样当别人拿到你的电脑的时候,即使已经过了cookie的有效期,仍然可以登陆。
既然我们都知道Cookie是有安全隐患的,但是我们不用又不行,因此,我们能做的就是降低风险:
1.通过将cookie中保存的信息进行加密处理,用户登陆成功以后,将时间戳和随机数合并通过MD5加密处理形成Token。
String token = Utils.MD5(System.currentTimeMillis()+Math.Rand(0,9999999));
当然,也可以通过用户名+系统时间生产Token或者将sessionId加密生产Token也可以。
2.将用户ID(uid或者userName)和有效时间(1个月)以及Token保存在cookie中,同时记录到数据库表中(Remember_Key)。
3.用户访问网站时,后台读取Cookie,获取uid和Token,去数据库对比,如果都存在,且在有效期内,则通过uid直接获取用户信息并保存session,直接跳转到首页。
前端可对此进行处理,获取到后台返回的数据后,展示用户名以及头像信息等。
4.后台需要做过滤器,过滤网站的所有页面,每当打开页面时,首先判断是否登陆,如果已经登陆则跳过,如果未登陆,需要先读取Cookie,判断是否匹配,如果匹配则跳过登陆,直接获取用户信息,否则跳转到登陆页面。
后台表设计:
id | user_id | token | expires_date | create_time | update_time |
1 | 41000000 | NGyuswVwxnXxz4BI1F1UyNoWWrxcuRiadPYpJcVTMN9DmDYrNvCEDdwMOS6o522JY8FPtQsLg | 1456381021993 | 2016-02-25 | 2016-02-25 |