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

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 页面。
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Kafka是一个高性能的分布式消息队列系统,可以实现高吞吐量、低延迟的消息传递。它支持点对点和发布-订阅两种消息传递模式。在仿牛客项目中使用Kafka可以实现消息的异步处理和分布式架构。 使用Kafka的第一步是创建一个主题(topic),主题既是消息的类别,也是消息在Kafka中的存储位置。可以使用命令行工具kafka-topics.bat来创建主题。例如,可以使用以下命令来创建一个名为test的主题: bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test 上述命令中,--bootstrap-server参数指定了Kafka服务器的地址和端口,--replication-factor参数指定了主题的副本数,--partitions参数指定了主题的分区数。创建主题后,可以向主题中发送消息,并由消费者进行消费。 要列出已经存在的主题,可以使用以下命令: kafka-topics.bat --list --bootstrap-server localhost:9092 需要注意的是,以上命令中的localhost:9092是Kafka服务器的地址和端口,根据实际情况进行修改。 总结起来,在仿牛客项目中使用Kafka,首先需要创建一个主题,然后可以使用相关命令行工具进行消息的发送和消费。这样可以实现消息的异步处理和分布式架构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [仿牛客论坛项目学习记录——5 Kafka 构建TB级异步消息系统](https://blog.csdn.net/dadayangpei/article/details/127173098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值