发表于: 2016-09-27 01:06:37
2 2277
Task05
要求:
1. 利用MD5对用户ID和登录时间加密,生成Token,放入Cookie中。
2. 拦截器里通过判断Cookie中Token的有效性来判断用户是否登录。
3. 修改Task4中的两个页面,一个设为用户不登录可以访问,一个设为用户必须登录才可以访问。要求用户必须登录才能访问的url统一增加前缀 /u/。
实现功能:
1. 注册Register模块
将URL中输入“localhost:8080/register”,进入注册页面。
输入账号和密码后,首先判断注册用户是否合法:如果允许注册,将新用户添加到数据库(密码加密),并跳转到注册成功页面,并提示用户注册成功;如果不允许(用户名不合规或用户已存在),则跳转到错误提示页面,附上超链接使用户重新跳转到注册页面。
2. 登录Login / 登出Quit模块
a. 登录Login
URL中输入“localhost:8080/login”,进入登录页面。
此处进行相应扩展,URL中“localhost:8080/home”进入不登录即可访问的主页,点击右上“登录”按钮同样可进入登录页面。
输入账号和密码后,首先验证登录用户信息:若验证成功,直接跳转到登录后主页(u/home),同时添加Cookie(Key为id(即username),Value为“登录时间”);如果验证未成功,跳转到错误提示页面,附上超链接使用户重新跳转到登录页面。
此处进行相应扩展,在登录时添加选择是否“十天内记住登录状态”的功能(大概就这个功能耗费了我最大的精力):如果选择“是”,Cookie有效期自动设为10天,方便用户下次登录时将帐号直接显示在输入框,不必再自己进行输入(由于密码不能解密,需自己输入);如果选择“否”,Cookie有效期设为1小时(在1小时之内,只要不退出登录,就一直保留登录状态,1小时后删除Cookie)。这里为方便后续操作,生成一个String型数据worktime,存放Cookie有效期(即10天或一小时,864000或3600)。
那么问题来了:因为存在多用户登录情况(如果只有一个用户就简单多了),那么如果多个用户上次未退出登录(识别的标识是看Cookie的Value是否为0,如果用户已退出登录则将其Cookie的Value直接设为0),那么要记住的是哪个用户的登录状态?我的做法是:从尚在有效期内且Value不为0(表示上次未退出登录)的所有用户Cookie中提取出最近一次活动的用户,即Value值最大的用户,将其作为默认登录用户。
考虑到这种情况:用户在登录后的第59min刚进入到主页,但Cookie依然会在下一分钟失效,所以应在下面的主页模块中进行设置,使得Cookie有效期设为以上次浏览主页时间为基点的一小时后。
注意:Cookie有效期为0和其Value为0是两个不同的概念。如果Cookie有效期设为0,则当浏览器关闭就不再保留。而在本任务中,如果Value为0,则表示用户已退出登录,此时该用户的Cookie有可能仍在有效期之内。要分清。
b. 登出Quit
当用户成功登录后,主页右上角除了显示用户登录信息之外,还会有登出按钮,单击“登出”,即完成退出登录。下次再进入“localhost/u/home”当然要重新登录。
本来想退出时只将Cookie中value设为“0”,有效期保留原值,但由于多用户登录的复杂情况,这里索性在退出时将有效期也一起设为0。因此,只要用户已退出登录,就不再保留用户Cookie。所以,由于在一台计算机上存在多用户登录的情况,上面的“十天内记住登录状态”功能只适用于上次未退出登录的用户。如果只有一个用户登录,对功能做简化操作,届时更简单也更方便。
另外很重要的是,因为拦截器拦截“/u/home”时判断用户是否登录的依据是session中的“loginUser”属性是否为null,因此一定要退出登录时将session的“loginUser”属性重新设为null。
3. 主页模块
主页未登录拦截功能:即URL中输入“localhost:8080/home”进入不添加拦截功能的主页,不登录即可访问;URL中输入“localhost:8080/u/home”进入添加拦截功能的主页,必须登录才可访问,并在右上角提示登录用户信息。
如果未登录而直接进入“localhost:8080/u/home”,进行拦截,跳转到登录页面。
维持Cookie有效期功能:在每次用户浏览主页后,自动将Cookie有效期更新为worktime。
维持Cookie最近登录时间记录功能:在每次用户浏览主页后,自动将Cookie的Value值更新为当前时间。
各模块结构与核心代码:
(只贴出与业务逻辑关联较大的核心代码示例,另外Dao层代码与个人Model层相关,贴出来难免误导后来者,因此Dao层代码不作展示,涉及到Dao层的部分可根据方法名判断出其所实现的功能)
1. 注册Register模块
2. 登录login模块
3. 登出Quit模块
4. 主页模块
5. 拦截器
演示:
如需获取该任务实例代码请留言。
评论