如何使用token保存用户登录信息

1.登录成功后生产token
登录成功之后,后台生成一个token,将token保存在redis中,key是token,value是用户id,并且把token响应给前端,前端每次请求时都把token传给后台进行鉴权。生成token代码如下:

private String logining(String account,Long userId){String token = Constants.TOKEN + Md5Util.md5(account + String.valueOf(System.currentTimeMillis())) + new Random().nextInt(1000);RedisUtils.put(token, userId, DAYS, TOKEN_TIMEOUT);return token;
}

2.自定义拦截器实现鉴权
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AuthorizeInterceptor extends HandlerInterceptorAdapter {

@Autowired
private UserSysRedis userSysRedis;@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {String accessToken = request.getHeader("access-token");String deviceId = request.getHeader("device-id");if (isNullOrEmpty(accessToken)) {throw new UnauthorizedException();}Long userId = RedisUtils.get(accessToken, Long.class);if (Objects.isNull(userId)) {throw new UnauthorizedException();}GlobalRequestContext.setUserId(userId);GlobalRequestContext.setAccessToken(accessToken);GlobalRequestContext.setDeviceId(deviceId);checkDeviceInfo(userId,deviceId);return super.preHandle(request, response, handler);
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {super.afterCompletion(request, response, handler, ex);
}/*** 校验设备信息* @param userId 用户id* @param deviceId 设备id*/
public void checkDeviceInfo(Long userId,String deviceId){if(StringUtils.isEmpty(deviceId)){return;}String key = AuthConstant.TEACHER_DEVICE_KEY+userId;//如果设备已注册到redis中,判断当前设备是否可用if(userSysRedis.hashHasKey(key,deviceId)){TeacherDeviceInfo deviceInfo = userSysRedis.hashGet(key, deviceId, new TypeReference<TeacherDeviceInfo>() {});if(Objects.isNull(deviceInfo)){return;}if(DeviceStatusEnum.ALTER_PASSWORD.equals(deviceInfo.getDeviceStatus())){//修改密码,抛出异常throw new CustomException(UserExceptionEnum.USER_ALTER_PASSWORD.getMsg(),UserExceptionEnum.USER_ALTER_PASSWORD.getCode(),null);}return;}//如果未注册,则添加到redis中TeacherDeviceInfo teacherDeviceInfo = new TeacherDeviceInfo().setDeviceId(deviceId).setDeviceStatus(DeviceStatusEnum.NORMAL_STATUS);userSysRedis.hashPut(key,deviceId,teacherDeviceInfo);
}

}
自定义拦截器继承HandlerInterceptorAdapter,在里面实现登录校验逻辑。逻辑是前端请求头传入token的值,后台拿到token后去redis中取,如果取到说明登录了,未取到说明没登录,跳转至登录页。

配置鉴权拦截器,交给spring管理:

/**

  • 教师端鉴权拦截器配置

  • @author liuzhihao

  • @date 2018/7/24
    */
    @Configuration
    @Slf4j
    public class AuthorizeConfiguration extends WebMvcConfigurerAdapter {

    /**

    • 在此处将拦截器注册成一个bean,可以在拦截器中使用@Autowired注入其它对象
      */
      @Bean
      public AuthorizeInterceptor authorizeInterceptor(){
      return new AuthorizeInterceptor();
      }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authorizeInterceptor())
    .addPathPatterns(“//teacher-app/”)
    .excludePathPatterns(“//open/”);

     super.addInterceptors(registry);
    

    }
    }
    这样请求路径中只要有teacher-app都会被拦截到

3.使用
接口方法:

@PutMapping("/teacher-app/{transferId}")
public Response<SchoolClassTransfer> update(@PathVariable("transferId") Long transferId, @RequestParam Long classId,@RequestParam Integer status) {long userId = GlobalRequestContext.getUserId();//处理业务逻辑return new Response<SchoolClassTransfer>().ok(classTransfer);
}

所有请求路径中带teacher-app的都会被拦截,进行鉴权,如果鉴权通过,则可以通过GlobalRequestContext.getUserId()取出登录用户id,鉴权不通过则抛出异常,前端跳转至登录页面。

token的使用方法相关推荐

  1. python token_python 产生token及token验证的方法

    1.前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击. 在经过再三思考之后,自己试着实现一个产生token和验证to ...

  2. 拼多多TOKEN安卓登录方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 Token的用途 TOKEN分类 TOKEN获取 TOKEN登录 独家TOKEN独享方法 联系 前言 提示:拼多多TO ...

  3. 运行shell脚本报错:“syntax error near unexpected token 的解决方法”

    运行shell脚本报错:"syntax error near unexpected token 的解决方法" 今天写了个Cshell脚本,运行报错syntax error near ...

  4. linux shell脚本无法执行,报错syntax error near unexpected token `$'\r''解决方法

    运行shell脚本时出现:syntax error near unexpected token `$'\r"的错误,一般是格式的问题,比如直接从txt文档拷贝过来的内容: 解决方法:sed ...

  5. java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析

    GitHub源码地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git 封装JTW生成token和校验方法 public class ...

  6. java token_Java实现基于token认证的方法示例

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  7. ASP.NET MVC 在WebService中Token的使用方法

    接口:WebService 方式:Token动态加密签名: 名词解释:Token就是服务端和客户端约定好的一个固定的密码字符串.微信接口上这么写的我就直接般过来了,结果有朋友不理解. WebServi ...

  8. token验证的方法

    统一token处理 自定义注解的方法及使用 排除token校验注解类 为不需要校验 token 的方法定义注解 @Documented //标记注解 @Target(ElementType.METHO ...

  9. 拼多多TOKEN独享方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 为什么要用Token TOKEN的种类 TOKEN获取 TOKEN独享 联系 前言 提示:这里可以添加本文要记录的大概 ...

最新文章

  1. Unable to find the ncurses libraries的解决办法
  2. mysql数据库服务器设置访问权限
  3. Net分布式系统之:微服务架构
  4. 图表相同数据会自动合并问题(finereport)
  5. 【CV学习笔记】色彩空间
  6. MySql常见数据类型及五大约束
  7. C. Not Adjacent Matrix
  8. 不断突破道,用道来挣钱才能长稳,才能心安!
  9. JS语法之:require
  10. 我是如何投资数字货币的(1.2版)
  11. python fun函数、求4x4整型数组的主对角线元素的和_C语言编程求一个4x4数组左下三角 包括主对角线元素的和...
  12. 如何在命令行快速获取公网动态 IP 地址
  13. 陕科大c语言题库,C语言考试题库
  14. 使用pydot 画CNN网络结构图
  15. 《ucore lab1 exercise5》实验报告
  16. c语言课设航班信息管理软件管理系统,c语言航班信息查询系统实验报告.doc
  17. win7的屏幕仅计算机,计算机win7双显示器的设置方法
  18. 洛谷P1710 地铁涨价
  19. 解决Mygui不支持中文路径
  20. Spring:Webflux响应式编程

热门文章

  1. (转载)constnbsp;charnbsp;*amp;nbs…
  2. Autodesk系列软件(如AutoCAD、Alias、VRED)许可不够
  3. NBS云硬盘无法挂载
  4. MCNP5 粒子输运 常见问题汇总与踩坑记录(导火索:死循环)
  5. 光格科技将于12月6日上会:拟募资6亿元,姜明武为实控人
  6. 临时表空间不足ORA-01652: unable to extend temp segment by 64 in tablespace
  7. 习题 9.10 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
  8. iso体系认证有哪些?
  9. 视频帧数(图片)和音频提取及保存方法图片合成视频方法---ffmpeg
  10. 测试管理之绩效考核指标--测试计划+测试用例+测试环境部署工作指标!!!