项目梳理-社区论坛系统

登录模块

登录模块

登录页面(未登录)

开发内容

  1. 账号、密码、验证码的显示;
  2. 颁发登录凭证(登录凭证是要落库的(ticket))
  3. 页面跳转

开发实现

登录:

  1. 验证账号、密码、验证码
  2. 成功:给客户端颁发登录凭证
  3. 失败:跳转到登录页面

退出登录:

  1. 将登录凭证的状态改为失效
  2. 跳转至网页首页

controller

  1. 检测验证码[起初用session来存,后期用redis优化]
  2. 检测账号密码[查库 mapper(User_table)][在内部service层颁发了ticket][ticket起初存库,后用redis优化]
  3. 使用cookie为client颁发ticket
  4. success -> ‘/index’ ; false -> ‘/site/login’

service

  1. UserService.login里进行[验证码、账号、密码]的校验,设置用户的登录状态,以及创建[凭证],设置登录状态;
  2. UserService.loginout里修改[凭证]里的登录状态;

entity

ticket要封装为一个实体类,包含[用户id、登录状态、过期时间]等属性信息。

技术盘点

  1. redis数据结构的选用
  2. URL重定向
  3. cookie & session

登录页面展示(已登录)

开发内容

在论坛的任何动态页面,都要在导航栏的头像下拉菜单里显示登录信息。

  1. 需要自定义一个登录拦截器,并重写拦截器方法;
  2. 对拦截器进行配置;

开发实现

通过拦截器对所有请求进行拦截,在整个登录周期内,对用户登录状态进行校验,并以线程隔离的方式持有用户信息。

  1. 定义一个拦截器
    • prehandler:进行ticket验证,并使用threadlocal将User实体 保存在hostHolder实体里;
    • posthandler: 返回一个User实体的modelAndView;
    • aftercompletion: 清除hostHolder;
  2. 对拦截器进行配置
    • 对静态页面不进行拦截,只对动态页面的请求进行拦截;
    • 对所有controller的请求都进行拦截;

权限校验

开发内容

  1. 自定义注解,在需要拦截的方法里加上这个自定义注解
  2. 定义一个拦截器,重写方法(需要对handler进行判断,捕获HandlerMethod的handler -> 获取handler的method -> 反射获取自定义注解的方法)
  3. 对拦截器进行配置

question

  1. 过完拦截器登录页面的展示 & aop实现日志记录,回过头对比下这两个,interceptor & aop ,为什么登录页面用的是拦截器,日志记录用的是aop?
  2. interceptor 的@Override 一定程度上反映了MVC的工作原理,需要对Spring MVC相关知识点进行关联掌握;
  3. interceptor 在何时进行拦截的?(以登陆信息拦截为例)
  4. 为什么在[拦截登录信息-持有用户信息]的时候要使用threadlocal?
  5. 为什么用hostHolder代替session对象?可以在请求结束后清除?
  6. 拦截器原理

点赞、关注

点赞业务逻辑关系

关注业务逻辑关系

Question

Q1:为什么要用kafka?

  1. 主要考虑的是kafka高吞吐,处理数据速度比较快,单机tps能达到百万级;
  2. 时延低,ms级以内,在众多mq里比较突出;
  3. 经过参数配置,消息可以做到零丢失;

todo

  1. 把权限验证进行梳理 [done]
  2. spring mvc 执行过程进行梳理 [todo]
  3. 拦截器原理进行梳理 [todo]