仿牛客社区项目笔记-注册登录模块

仿牛客社区项目笔记-注册登录模块

  • 1. 注册模块
    • 1.1 注册
    • 1.2 激活账号
  • 2. 登录模块
    • 2.1 生成验证码
    • 2.2 登录
    • 2.3 显示登录信息
    • 2.4 账号设置(修改头像)
    • 2.5 账号设置(修改密码)
    • 2.6 检查登录状态
    • 2.7 退出登录

1. 注册模块

分为 注册, 激活账号。

1.1 注册

  1. 点击注册,根据 LoginController 层的 /register(get)返回注册页面。
  2. 输入账户,密码,邮箱,点击注册按钮。根据 /register(post)传入User。调用 userService.register 方法。
  3. userService.register 方法首先根据用户名和邮箱查询数据库看是否已经存在,如果存在,返回错误信息。如果不存在,对User加入 Salt 属性,即五位随机字符串,为了和密码拼接后进行md5加密。将加密后的密码存入数据库。分别设置Type,Status为0。设置随机字符串激活码。设置用户头像和创建时间。将User插入数据库。
  4. 使用mailClient发送激活邮件。将可能带有错误信息的Map返回。
  5. LoginController 层得到 Map 判断是否为空,为空则注册成功,返回 /site/operate-result 页面。否则返回 /site/register 页面,并将错误信息加入model中。

1.2 激活账号

  1. 首先在CommunityConstant工具类中设置三个常量表示激活状态。
//激活成功
int ACTIVATION_SUCCESS = 0;

//重复激活
int ACTIVATION_REPEAT = 1;

//激活失败
int ACTIVATION_FAILURE = 2;
  1. 在邮箱中点击激活链接,调用 LoginController 层的 /activation/{userId}/{code} 。调用userService.activation(userId, code)方法。首先判断 User 中的status是否已经等于1,已经等于1返回 重复激活 信息。然后判断 User 中的激活码是否与code相等,等则设置status为1,返回激活成功。不等返回激活失败。
  2. LoginController 层获取 int 返回值,判断0 1 2 在model中加入相应信息,返回/site/operate-result 页面。

2. 登录模块

分为 生成验证码, 登录,显示登录信息, 账号设置(修改头像),账号设置(修改密码),检查登录状态,退出登录。

2.1 生成验证码

  1. 在首页点击登录或者在其他页面转入登录页面时,验证码路径访问 “/kaptcha” 。
  2. 在 LoginController 层中根据 KaptchaConfig 配置类中的 kaptchaProducer 来生成验证码文本和图像,然后将文本存入在session中, 生成随机字符串作为Redis中验证码的key,将key放在cookie中传给response。然后利用key将验证码文本存入Redis,设置失效时间为60s。为了判断用户在登录时传入的code是否等于该文本。
  3. 再通过response将图像返回给浏览器。

2.2 登录

  1. 在登录页面输入用户名,密码,验证码和是否勾选“记住我”。将对应的username,password,code,rememberme通过 “/login” 传入 login 方法。
  2. LoginController 层首先从session中取出验证码文本判断code是否相等, login方法在参数中使用 @CookieValue 注解从cookie中取出Redis中验证码文本的key,判断一下key是否为空,不为空则取出Redis中的验证码文本判断是否和code相等,不等返回Map。然后根据remember选取登录凭证超时时间。然后将username,password 和超时时间 传入给userService.login 方法。
  3. userService.login 方法拿到 三个值先判空,空则返回Map。然后根据username查询数据库看账号是否存在。然后查询status看账户是否已经激活。最后验证密码(调取salt和password拼接后使用md5加密再和数据库中密码比对)。然后生成登录凭证,见LoginTicket,将登陆凭证放入Redis,key为随机字符串Ticket字段。将凭证放入Map并返回给 LoginController 层。
  4. LoginController 层拿到Map。查看其中是否有凭证,有将凭证放入cookie返回给浏览器,重定向转入index。无则将Map中报错信息加入model,转入login。

2.3 显示登录信息

前提知识:拦截器的 preHandle 方法在 Controller 层之前执行。postHandle 在Controller之后执行。afterCompletion 在TemplateEngine之后执行。使用配置类 WebMvcConfig 将拦截器注册,即可自动拦截。

  1. 在 LoginTicketInterceptor 的 preHandle 方法中使用工具类CookieUtil 获取登录凭证。然后使用 userService.findLoginTicket 方法查询凭证,并检验凭证是否有效。 如果有效,根据凭证中的userId 查询到 User 对象。然后将 User 对象利用工具类 hostHolder 存入到 ThreadLocal中。
  2. 在 postHandle 中取出 User 放入 modelAndView。
  3. 在最后的 afterCompletion 中将 User 释放。
  4. 使用配置类 WebMvcConfig 将拦截器注册,即可自动拦截。
  5. 在index.html 中判断 model 中是否有 User,有则隐藏注册登录。无则隐藏消息和个人信息。

2.4 账号设置(修改头像)

  1. 点击账号设置根据 UserController层 (/user)的 /setting 返回 /site/setting 页面。
  2. 选择上传文件,点击上传根据 UserController层的 /upload 读取到上传的图像headerImage。由于图像名字容易重复,故随机生成图像名称并拼接图像类型后缀。然后将图像存入指定路径。从 hostHolder 中获取该User ,然后更新 User 的头像路径。然后重定向返回首页。
  3. 当首页显示头像,寻找头像路径时,调用了 UserController层的 /header/{fileName} 。从存储路径读取图像并写入response的输出流中。

2.5 账号设置(修改密码)

  1. 输入原始密码和新密码后,点击立即保存。映射到 UserController层 (/user)的 /updatePassword 。
  2. 从hostHolder中取出User,调用 userService.updatePassword (user.getId(), oldPassword, newPassword) 方法。
  3. userService.updatePassword 方法中,首先验证原始密码,不匹配则返回错误信息。匹配则更新密码。
  4. 成功则返回登录页面,失败则返回setting页面,并将错误信息输出。

2.6 检查登录状态

为了防止用户不登录,直接通过http://localhost:8080/community/user/setting路径访问页面,我们使用自定义注解拦截器来进行限制。

  1. 自定义注解LoginRequired,设置ElementType为方法,RetentionPolicy为运行时。对UserController层的 /setting,/upload 等方法添加注解。
  2. 编写LoginRequiredInterceptor拦截器。在preHandle方法中,判断handler的方法中的注解是否有LoginRequired,并且判断HostHolder中的User是否为空。同时满足时,使用response.sendRedirect重定向到登录页面。
  3. return false。

2.7 退出登录

  1. 点击退出登录,调用 LoginController 层的 /logout 。从cookie中取出登录凭证。调用userService.logout(ticket)方法。
  2. 该方法调用 loginTicketMapper.updateStatus(ticket, 1)。 将login_ticket表中的状态改为1, 即为失效。 该方法拿到ticket,从Redis中取出对应 LoginTicket 对象,将 Status 设置为1。重新存入Redis。
  3. 重定向 /login 页面。

你可能感兴趣的:(仿牛客社区项目笔记,java)