token的使用方法
如何使用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都会被拦截到- 在此处将拦截器注册成一个bean,可以在拦截器中使用@Autowired注入其它对象
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的使用方法相关推荐
- python token_python 产生token及token验证的方法
1.前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击. 在经过再三思考之后,自己试着实现一个产生token和验证to ...
- 拼多多TOKEN安卓登录方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 Token的用途 TOKEN分类 TOKEN获取 TOKEN登录 独家TOKEN独享方法 联系 前言 提示:拼多多TO ...
- 运行shell脚本报错:“syntax error near unexpected token 的解决方法”
运行shell脚本报错:"syntax error near unexpected token 的解决方法" 今天写了个Cshell脚本,运行报错syntax error near ...
- linux shell脚本无法执行,报错syntax error near unexpected token `$'\r''解决方法
运行shell脚本时出现:syntax error near unexpected token `$'\r"的错误,一般是格式的问题,比如直接从txt文档拷贝过来的内容: 解决方法:sed ...
- java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
GitHub源码地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git 封装JTW生成token和校验方法 public class ...
- java token_Java实现基于token认证的方法示例
随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...
- ASP.NET MVC 在WebService中Token的使用方法
接口:WebService 方式:Token动态加密签名: 名词解释:Token就是服务端和客户端约定好的一个固定的密码字符串.微信接口上这么写的我就直接般过来了,结果有朋友不理解. WebServi ...
- token验证的方法
统一token处理 自定义注解的方法及使用 排除token校验注解类 为不需要校验 token 的方法定义注解 @Documented //标记注解 @Target(ElementType.METHO ...
- 拼多多TOKEN独享方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 为什么要用Token TOKEN的种类 TOKEN获取 TOKEN独享 联系 前言 提示:这里可以添加本文要记录的大概 ...
最新文章
- Unable to find the ncurses libraries的解决办法
- mysql数据库服务器设置访问权限
- Net分布式系统之:微服务架构
- 图表相同数据会自动合并问题(finereport)
- 【CV学习笔记】色彩空间
- MySql常见数据类型及五大约束
- C. Not Adjacent Matrix
- 不断突破道,用道来挣钱才能长稳,才能心安!
- JS语法之:require
- 我是如何投资数字货币的(1.2版)
- python fun函数、求4x4整型数组的主对角线元素的和_C语言编程求一个4x4数组左下三角 包括主对角线元素的和...
- 如何在命令行快速获取公网动态 IP 地址
- 陕科大c语言题库,C语言考试题库
- 使用pydot 画CNN网络结构图
- 《ucore lab1 exercise5》实验报告
- c语言课设航班信息管理软件管理系统,c语言航班信息查询系统实验报告.doc
- win7的屏幕仅计算机,计算机win7双显示器的设置方法
- 洛谷P1710 地铁涨价
- 解决Mygui不支持中文路径
- Spring:Webflux响应式编程
热门文章
- (转载)constnbsp;charnbsp;*amp;nbs…
- Autodesk系列软件(如AutoCAD、Alias、VRED)许可不够
- NBS云硬盘无法挂载
- MCNP5 粒子输运 常见问题汇总与踩坑记录(导火索:死循环)
- 光格科技将于12月6日上会:拟募资6亿元,姜明武为实控人
- 临时表空间不足ORA-01652: unable to extend temp segment by 64 in tablespace
- 习题 9.10 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
- iso体系认证有哪些?
- 视频帧数(图片)和音频提取及保存方法图片合成视频方法---ffmpeg
- 测试管理之绩效考核指标--测试计划+测试用例+测试环境部署工作指标!!!