用户登录

登录需求分析
1:获取账号跟密码
2:通过账号密码查询数据库获取用户对象user
3:如果用户存在,表示登录成功
4:使用UUID创建出随机的唯一的token值String  token = ....
5:以token'为key,user为value 缓存到redis中
6:将token跟用户对象使用json格式放回浏览器浏览器:接受到返回值,解析出token跟用户信息,并缓存前端发起请求是,获取浏览器缓存的token值,通过请求头的方式携带到后端服务器接口2:1>通过请求对象获取前端传过来tokenString token =req.getHeader("token")2>以token为key,查Redis缓存库得到用户对象user3>判断user是否为null
----------------------------------------------------------------------
Session方式:
4:将user对象缓存到session中服务器:1>系统马上创建cookie对象Cookie c =new Cookie("jsessionid",xxx)2>使用response对象将cookie回传倒浏览器response.addCookie(c)浏览器:1>浏览器接受cookie之后会缓存cookie2>第二次请求时,浏览器会自动将cookie携带到后端接口2:1:通过请求对象获取session对象1>请求对象获取cookie对象,然后解析出jsessionid2>再通过jsessionid找到之前创建session对象2:通过session对象获取之前缓存的用户对象

令牌登录方式流程(token)

 1:通过请求获取username和password,查询数据库得到用户对象user2:通过user对象判断user是否为null,如果为null提示,如果不为null表示登录成功3:通过uuid方式创建token令牌(要求:随机,唯一)String token=UUID().randomUUID()...4:以token作为key,用户对象user作为value缓存到redis数据库中,token的有效时间设置为30分钟5:将token跟user对象使用json格式返回浏览器6:浏览器接受并解析响应数据得到token更user对象,缓存到cookie(此处的cookie也设置有效时间是30分钟)
---------------------------------------------------------------------------------------   7:第二次访问接口时,前端发送请求时,将浏览器缓存token数据添加到请求头中,跟请求参数一起携带到服务器8:服务器通过请求对象,调用String token =req.getHeader("token"),得到前端传过来的token数据9:以token为key查询redis缓存库,得到user对象10:判断user对象是否为null,决定当前是否已经登录1>如果user为null,表示没有登录2>如果user不为null,表示已经登录,登录成功后,此时必须重置token有效时间,不重置的话,过30分钟又要重新登录,用户的体验会非常差
UserController
@RestController
@RequestMapping("/users")
public class UserController {//首次登录@PostMapping("/login")public Object login(String username, String password) {//1.验证手机号和密码是否正确,正确就返回用户信息,这个用来返回给前端UserInfo userInfo = userInfoService.login(username, password);//2.生成token并缓存,通过token拼接key,userInfo为valueString token = userInfoRedisService.setToken(userInfo);//将userInfo和token存入map中HashMap<String, Object> map = new HashMap<>();map.put("token", token);map.put("user", userInfo);return JsonResult.success(map);}//再次登录获取token和user@RequireLogin@GetMapping("/currentUser")public Object currentUser(HttpServletRequest request) {String token = request.getHeader("token");//通过token查询redis库UserInfo userInfo = userInfoRedisService.getUserByToken(token);return JsonResult.success(userInfo);}
}
UserInfoServiceImpl(验证用户名和密码)
  @Service
public class UserInfoServiceImpl implements IUserInfoService {   //1.验证用户名和密码是否正确public UserInfo login(String username, String password) {UserInfo userInfo = userInfoRepository.findByPhone(username);if (userInfo == null || !userInfo.getPassword().equals(password)) {throw new LogicException("用户名或密码错误");}userInfo.setPassword("");return userInfo;}
}
UserInfoRedisServiceImpl(使用redis存取用户信息)
@Service
public class UserInfoRedisServiceImpl implements IUserInfoRedisService {@Autowiredprivate StringRedisTemplate template;//2.生成token并缓存,通过token拼接key,userInfo为value@Overridepublic String setToken(UserInfo userInfo) {//创建tokenString token = UUID.randomUUID().toString().replaceAll("-", "");//生成keyString key = RedisKeys.USER_LOGIN_TOKEN.join(token);String value = JSON.toJSONString(userInfo);//将对象转换为对象//缓存到redis中,并设置有效时间template.opsForValue().set(key, value, USER_LOGIN_TOKEN.getTime(), TimeUnit.SECONDS);return token;}-------------------------------------------------------------------------------------//再次登录//通过token查询出user@Overridepublic UserInfo getUserByToken(String token) {//先判断是否为空if (!StringUtils.hasLength(token)) {return null;}//通过token拼接keyString key = RedisKeys.USER_LOGIN_TOKEN.join(token);if (template.hasKey(key)) {String userStr = template.opsForValue().get(key);//将Json字符串解析为对象UserInfo userInfo = JSON.parseObject(userStr, UserInfo.class);//设置有效时间template.expire(key, RedisKeys.USER_LOGIN_TOKEN.getTime(), TimeUnit.SECONDS);return userInfo;}return null;}
}

redis中key键设计善于枚举类

//redis key重设计,因为在业务层设计key键会导致有可能和其他人设计名字重复,
//所有我们可以将key键统一放在枚举类中管理,这样key就不会重复了
@Getter
public enum RedisKeys {VERIFY_CODE("verify_code", Consts.VERIFY_CODE_VAI_TIME * 60L),USER_LOGIN_TOKEN("user_login_token", Consts.USER_INFO_TOKEN_VAI_TIME * 60L);//相当于下面写法//public static final RedisKeys VERIFY_CODE// =new RedisKeys("verify_code", Consts.VERIFY_CODE_VAI_TIME * 60L);private String prefix;private Long time;private RedisKeys(String prefix, Long time) {this.prefix = prefix;this.time = time;}//用于拼接keypublic String join(String... values) {StringBuilder sb = new StringBuilder();sb.append(prefix);for (String value : values) {sb.append(":").append(value);}return sb.toString();}
}

令牌登录方式流程(token)相关推荐

  1. 【前后端常见的登录方式】

    四种常见的登录方式 1.Cookie + Session 登录 2.Token 登录 3.SSO 单点登录 4.OAuth 第三方登录 文章目录 四种常见的登录方式 @[TOC](文章目录) 一.Co ...

  2. 登录令牌JWT — JSON WEB TOKEN

    登录令牌JWT - JSON WEB TOKEN 关于作者 作者介绍

  3. CAS单点登录详细流程

    一.CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS ...

  4. go token验证_GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;...

    gtoken 介绍 基于GoFrame框架的token插件,通过服务端验证方式实现token认证:已完全可以支撑线上token认证,通过Redis支持集群模式:使用简单,大家可以放心使用: gtoke ...

  5. 基于MQ对登录系统核心流程进行异步化改造,提升系统性能-11

    基于MQ对登录系统核心流程进行异步化改造,提升系统性能 1.会员表与实体类定义 2.登录RocketMQ 参数定义 3.登录消息生产者 4.登录服务(LoginService) 5.登录Control ...

  6. 基于Spring Boot实现电脑端网页微信扫码授权登录方式一(附带完整源码)

    简介 电脑端微信网页扫码授权登录有2种方式: 第一种:基于微信公众号,单独获取登录二维码扫码,然后扫码登录,程序控制跳转逻辑,例如CSDN: 第二种:基于微信开放平台,跳转到微信二维码页面进行扫码登录 ...

  7. AIP 封装与搭建及登录注册关于token的一些理解

    前言 一. API搭建 二.API的封装 三.登录注册 1.token的理解 总结## 标题 一.搭建脚手架,创建基本目录 在这里插入图片描述 以上是一个vue.3.0标准目录结构 1.man.js ...

  8. Getway jwt 单点登录以及刷新token时间

    Getway jwt 单点登录以及刷新token时间 不用nosql或其他 1.集成jwt pom依赖: <dependency><groupId>io.jsonwebtoke ...

  9. 【图解】用户登录验证流程,这下彻底搞懂了!

    本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现. https://juejin.cn/post/70 ...

最新文章

  1. arcgis 同名图层合并_ArcGIS实践教程(37)ArcGIS/ArcMap多个图层(要素类)的合并
  2. 自定义结构体-相机参数数据类型
  3. python五子棋人人对战_五子棋-人人对战
  4. 换npm yarn的源让install超时去死吧
  5. python 财务报表审计_用Python来分析审计行业的这10年
  6. boost::signals2模块实现为类定义后构造函数的示例
  7. c语言学习之用筛选法求100之内的素数。
  8. python抓取网站的图片并下载到本地
  9. Vue中computed和watch的区别(面试题)
  10. 神话与谬误:争论C++前你应当知道什么
  11. centos中安装nginx
  12. [UOJ22]外星人
  13. 你知道谷歌有个社区叫 GBG 么?
  14. 余贞侠C语言程序设计(课后答案)
  15. 彻底卸载VS2015的工具及使用方法,亲测有效!!!
  16. ADAS功能中LCA、LKA、LCK...区别
  17. Linux系统下常用的中文输入法
  18. 基础平台项目之树形菜单权限配置实现
  19. 智能家居,产业跌宕三十年
  20. 二元一次在线计算机,(二元一次)方程组求解在线计算器_三贝计算网_23bei.com

热门文章

  1. 块级和图片的1px间隙
  2. 树莓派驱动水星无线网卡(MW150UH)教程指南
  3. 运动神经元有哪些特征 容易与哪些疾病混淆
  4. 单卡3090可得专属ChatGPT:使用LoRA+ChatGLM
  5. php bcd编码,什么是BCD码、8421码、余三码、格雷码
  6. python中in的用法
  7. 如何准备面试?“-80,阿里Java开发面试解答
  8. 搭建自己的知识体系 自我提升
  9. python根据excel生成报表_python生成Excel图表(通过xlsxwriter)
  10. Android 8.0 状态栏信号显示、信号定制