springboot项目使用redis实现唯一登录
2019-08-30 17:58
1021 查看
唯一登录使用技术 redis的token令牌实现
实现效果
1.数据表结构 (用户登录表不写了)
-- Table structure for edu_user_only -- ---------------------------- DROP TABLE IF EXISTS `edu_user_only`; CREATE TABLE `edu_user_only` ( `id` int(11) NOT NULL AUTO_INCREMENT, `token` varchar(255) DEFAULT NULL COMMENT 'redis token ', `login_type` varchar(20) DEFAULT NULL COMMENT 'pc h5', `clevice_info` varchar(255) DEFAULT NULL COMMENT '设备信息', `is_availability` int(10) DEFAULT '0' COMMENT '是否可用0 可用 1不可用', `user_id` int(11) DEFAULT NULL COMMENT '创建用户id', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of edu_user_only -- ---------------------------- BEGIN; INSERT INTO `edu_user_only` VALUES (30, 'mt.pc.login8c9b8846-0975-4026-ae06-13f9784c7bdccc75d5bada8f4d26abf657b7fab252b9', 'pc', 'pc', 1, 4805, '2019-08-30 16:33:50', '2019-08-30 16:33:50'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;
2.简单的代码实现 userid+登录类别 查询token
(不用地方或者浏览器生成token都不一样)
public void userLogin(String userId,String newToken){ Map map=new HashMap(); map.put("userId",userId); map.put("loginType","pc"); UserOnly userOnly=new UserOnly(); userOnly.setUserId(Integer.parseInt(userId)); userOnly.setCleviceInfo("pc"); userOnly.setLoginType("pc"); userOnly.setIsAvailability(1); userOnly.setToken(newToken); userOnly.setCreateTime(new Date()); userOnly.setUpdateTime(new Date()); UserOnly userOnlyByUserIdAndType = userOnlyService.selectLoginOnlyByUserIdAndType(map); if (userOnlyByUserIdAndType==null){ //唯一登录表中插入数据 userOnlyService.insertLoginOnly(userOnly); }else { //删除token 重新生成 userOnlyService.deleteLoginOnlyById(userOnlyByUserIdAndType.getId()); redisUtil.delKey(userOnlyByUserIdAndType.getToken()); userOnlyService.insertLoginOnly(userOnly); } }
3.前端定时
userLoginOnlyVip 判断用户是否是vip用户(普通用户太多,为了减少服务器压力)
而且不会放在首页,放在需要的页面。也是为了减少服务器压力
<script> setInterval(function(){ var userLoginOnlyVip = $("#userLoginOnlyVip").val(); if (userLoginOnlyVip==1){ $.ajax({ //几个参数需要注意一下 type: "POST",//方法类型 contentType: "application/json;charset=UTF-8", dataType: "json",//预期服务器返回的数据类型 url: "/sso/user/loginOnly",//url data: JSON.stringify({ }), success: function (result) { var json = eval(result); console.log(json); //打印服务端返回的数据(调试用) if (json.code == 200) { } ; if (json.code == 500) { // 账户在另一处登录 显示 $(".log-in-again").show(); $(".motaiceng").show(); } ; }, }); } },5000) </script>
总结
1. 判断是否是pc和h5 ,使用类别+userid 查询token(因为不同的地方(不同浏览器)生成的token不一样)
然后清除token,生成新的token(key为token value=userid)前端定时检查会查询token,不一致会顶下去
2.为了减少服务器压力,一般会判断,用户是否是会员(在加新跳检查),或者在特定的页面(比如首页,没什么东西就不需要了)
相关文章推荐
- docker安装redis连接redis可视化工具Redis Desktop Manager+springboot项目使用Cache缓存+springboot项目整合 Redis 实现缓存
- docker安装redis连接redis可视化工具Redis Desktop Manager+springboot项目使用Cache缓存+springboot项目整合 Redis 实现缓存
- 使用IDEA创建Spring Boot项目, 整合Mybatis ,连接MySql数据库,实现简单的登录注册功能
- 使用springboot+redis实现session共享
- 使用springboot+redis实现session共享
- Springboot 使用 Jedis、RedisTemplate 整合 Redis 实现并发锁
- 使用springboot+redis实现session共享
- Spring Boot使用HandlerInterceptorAdapter和WebMvcConfigurerAdapter实现原始的登录验证
- 使用springboot+redis实现session共享
- shiro+cas+spring-data-redis实现多系统单点登录和分布式项目的session同步
- SpringBoot项目 使用Sprin Data Jpa 实现数据库的 增 ,删, 改, 查操作
- 初次使用springboot与jQuery实现简单的用户登录注册功能
- idea实现springboot热部署方法(不需要重启项目,类似eclipse自带热部署的使用)
- springboot整合redis使用nginx实现负载均衡实现session共享
- Spring Boot高级教程之使用Redis实现session共享
- Spring Boot系列(七)Spring Boot使用Redis实现session共享
- 使用 SpringBoot 之 JPA 整合 Redis 实现缓存
- springboot项目Nginx+Tomcat实现负载均衡结合Redis实现session共享问题
- springboot中使用redis实现异步消息通知
- springboot+shiro实现登录系数限定,thymeleaf中使用shiro标签