[SpringBoot项目回顾总结2-TouTiao]

注册

步骤

在这里插入图片描述
LoginCtroller下进行注册的实现
model包下实现User类。dao下实现UserDAO,service包下UserService

  1. 首先调用userService.register(username, password),返回Map类的对象用于返回错误信息,如下。
    在这里插入图片描述

  2. 新建一个User对象,存放当前user的名字username,利用牛客网头像库随机生成用户一个初始头像,并通过UUID给用户密码加salt然后再利用MD5进行进一步加密,使用户的安全性得到保证。通过userDAO.addUser(user);添加到数据库MySQL。
    在这里插入图片描述

  3. 注册成功后下发ticket(即token),实现单点登录(SSO)。返回map对象到Controller供使用。

  4. 用户注册成功后在Controller层通过Cookie记录ticket并返回给客户端,实现单点登录。
    在这里插入图片描述

  5. 服务端利用拦截器的prehandle实现对ticket的验证,以依赖注入的方式创建HostHolder类(表示当前用户是谁),并通过HostHolder(利用ThreadLocal实现,通过线程本地变量存储每个user);
    在这里插入图片描述在这里插入图片描述
    每一条线程只能get当前线程的user。

  6. 并利用拦截器的postHandle实现在渲染前加入用户信息,使得页面出现用户。渲染完成后调用afterCompletion清除该线程。
    关于这三种handle引用炎泽的博客链接

这里是引用

在这里插入图片描述
拦截器通过configuration包下的ToutiaoWebConfiguration实现WebMvcConfigurer重写addInterceptors实现。
在这里插入图片描述

扫描二维码关注公众号,回复: 11297400 查看本文章

总结登录后进入主页127.0.0.1:8080的步骤顺序

  1. 进入拦截器的prehandle对用户是否登录进行验证
  2. 执行拦截器的posthandle对ModelAndView加入用户信息
  3. 渲染好首页后打开
  4. 渲染完毕,清楚ThreadLocal中为当前user创建的线程。

注意

  1. ticket(token)在注册(reg)时是直接存入redis的,因此后续在客户端对该用户登录,服务端对该客户端的cookie中的ticket进行认证时直接从中间件redis中取出。这个项目原先是将ticket存在mysql中的,后来在回顾代码总结时发现这样效率很低,于是直接将ticket存储在redis中提高效率
  2. 采用token而不采用session是因为使用session对服务器有压力,二是因为不能抵御CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。
  3. 用户每次登录时都会重新随机生成一个ticket并更新,然后下发给客户端。这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。
    在这里插入图片描述
    在这里插入图片描述

登录

登录逻辑基本与注册过程一致,唯一区别就是少了注册过程对新用户(user)通过dao层写入数据库。

退出

调用UserService的logout,删除redis中缓存的该用户的ticket,并返回(重定向)到主页
在这里插入图片描述
在这里插入图片描述

用户状态权限的判断

比如用户要访问/setting页面的信息,我们明白,这个页面只有登录后才能访问。所以新建一个拦截器LoginRequiredIntercepter,利用该拦截器的prehandle方法来实现该功能。

  1. 首先我们需要在webconfiguration下注册这第二个拦截器,可以发现LoginRequiredIntercepter只对/setting页面进行拦截,而上面用户认证的拦截器是全局层面的拦截器。注意 拦截器代码的顺序即拦截器执行的优先级顺序,即此处先执行对用户登录的认证,对hostHolder添加当前user,再执行第二个拦截器,如果此时登录状态,则hostholder中有user就会顺利执行后面的程序,否则直接返回到/?pop=1页面。
    在这里插入图片描述
  2. 重写prehandle方法实现对未登录用户拦截
    在这里插入图片描述

阶段1总结

在这里插入图片描述

  1. 当前传输是明文,可采用HTTPS协议,其还可以防止运营商加广告。
    在这里插入图片描述
    比如访问牛客的一个帖子,访问的当前页是1,链接中的参数page=1,当点到其他页时比如第2页,链接中的参数page=1并没有更新,但是却已经读到了数据库中page=2的内容.
    本项目中ajax直接在前端中里用了

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/106816633