-
分布式day10_01-基于Token令牌方式解决Session共享
2019-08-18 17:53:32在使用 spring - session 方式实现分布式session一致性的基础上再加上代码 创建TestTokenController package com.itmayiedu.controller; import org.springframework.beans.factory.annotation.Autowired; ...在使用 spring - session 方式实现分布式session一致性的基础上再加上代码
创建TestTokenController
package com.itmayiedu.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.itmayiedu.session.TokenService; @RestController public class TestTokenController { @Autowired private TokenService tokenService; // 1. 使用token方式代替Session功能 session 原理在服务器端创建 session 返回对应的 sessionid 给客户端 @RequestMapping("/put") public String put(String object){ return tokenService.put(object); } @RequestMapping("/get") public String get(String token){ return tokenService.get(token); } // 生成好的 token 如何存放? 本地 移动端 存放本地文件 浏览器 存放 cookie // http 请求如何传递呢? 最好建议放在请求头里面 }
创建RedisService
import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; /** * 功能说明: <br> * 创建作者:每特教育-余胜军<br> * 创建时间:2018年8月1日 下午4:07:32<br> * 教育机构:每特教育|蚂蚁课堂<br> * 版权说明:上海每特教育科技有限公司版权所有<br> * 官方网站:www.itmayiedu.com|www.meitedu.com<br> * 联系方式:qq644064779<br> * 注意:本内容有每特教育学员共同研发,请尊重原创版权 */ @Component public class RedisService { @Autowired private StringRedisTemplate stringRedisTemplate; // public void set(String key, Object object, Long time) { // stringRedisTemplate.opsForValue(); // // 存放String 类型 // if (object instanceof String) { // setString(key, object); // } // // 存放 set类型 // if (object instanceof Set) { // setSet(key, object); // } // // 设置有效期 以秒为单位 // stringRedisTemplate.expire(key, time, TimeUnit.SECONDS); // } // redis 在服务器集群的时候 分布式缓存可以共享 public void setString(String key, Object object) { // 开启事务权限 // stringRedisTemplate.setEnableTransactionSupport(true); try { // 开启事务 begin // stringRedisTemplate.multi(); String value = (String) object; stringRedisTemplate.opsForValue().set(key, value); System.out.println("存入完毕,马上开始提交redis事务"); // 提交事务 // stringRedisTemplate.exec(); } catch (Exception e) { // 需要回滚事务 // stringRedisTemplate.discard(); } } public void setSet(String key, Object object) { Set<String> value = (Set<String>) object; for (String oj : value) { stringRedisTemplate.opsForSet().add(key, oj); } } public String getString(String key) { return stringRedisTemplate.opsForValue().get(key); } }
创建TokenService
package com.itmayiedu.session; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class TokenService { @Autowired private RedisService redisService; //使用token方式代替Session功能 public String put(String value){ //1. 判断是否为空 if(value == null){ return null; } // 2.先生成对应的token(token 实际上等于key) String token = getToken(); // 3. 存入在redis中 redisService.setString(token, value); return token; } public String get(String token){ return redisService.getString(token); } public String getToken() { return UUID.randomUUID().toString(); } }
启动nginx、redis
启动项目
浏览器测试
拿到token,通过token在拿到值
然后一直刷新都可以拿到值,这里没有演示拿到服务器的端口号,没有这么明显区分集群
-
分布式session之token解决方案实现
2018-11-04 16:08:00分布式session之token解决方案实现 基于令牌(Token)方式实现Session解决方案,因为Session本身就是分布式共享连接 用token代替session 废话不多说,看项目: pom.xml <project xmlns=...分布式session之token解决方案实现
基于令牌(Token)方式实现Session解决方案,因为Session本身就是分布式共享连接
用token代替session
废话不多说,看项目:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId> com.toov5.tokenSession</groupId> <artifactId>tokenSession</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <weixin-java-mp.version>2.8.0</weixin-java-mp.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.locales>zh_CN</project.build.locales> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> --> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!-- Testing Dependencies --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <maimClass>com.meiteedu.WxMpApplication</maimClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
yml
server: port: 8081 spring: redis: database: 0 host: 192.168.91.3 port: 6379 password: 123 jedis: pool: max-active: 8 max-wait: -1 max-idle: 8 min-idle: 0 timeout: 10000 redis: hostname: 192.168.91.3 port: 6379 password: 123
redis
package com.toov5.service; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; @Component public class RedisService { @Autowired private StringRedisTemplate stringRedisTemplate; //这样该方法支持多种数据类 public void set(String key , Object object, Long time){ if (object instanceof String ) { //判断下是String类型�? String argString =(String)object; //强转�? //存放String类型 stringRedisTemplate.opsForValue().set(key, argString); } //如果存放Set类型 if (object instanceof Set) { Set<String> valueSet =(Set<String>)object; for(String string:valueSet){ stringRedisTemplate.opsForSet().add(key, string); //此处点击下源码看 第二个参数可以放好多 } } //设置有效� if (time != null) { stringRedisTemplate.expire(key, time, TimeUnit.SECONDS); } } //做个封装 public void setString(String key, Object object){ String argString =(String)object; //强转 //存放String类型 stringRedisTemplate.opsForValue().set(key, argString); } public void setSet(String key, Object object){ Set<String> valueSet =(Set<String>)object; for(String string:valueSet){ stringRedisTemplate.opsForSet().add(key, string); //此处点击下源码看 第二个参数可以放好多 } } public String getString(String key){ return stringRedisTemplate.opsForValue().get(key); } }
token的封装
package com.toov5.service; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ch.qos.logback.core.subst.Token; @Service public class TokenService { @Autowired private RedisService redisService; // 1 使用token方式替代session功能 //存入和获取 public String put(Object value){ //判断您是否为空 if (value == null) { return null; } // 先生成对应的token(token 实际上等于key) String token = getToken(); //存入在redis中 redisService.setString(token, value); //直接返回对应的token return token; } public String get(String token){ return redisService.getString(token); } public String getToken(){ return UUID.randomUUID().toString(); } }
controller
package com.toov5.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.toov5.service.TokenService; @RestController public class TestTokenController { @Autowired private TokenService tokenService; //使用token方式替代session sessiong服务器端创session 返回sessionid @RequestMapping("/put") public String put(String value){ String string = tokenService.put(value); System.out.println(string); return string; } //生成好的token如何存放? 移动端存放本地文件 浏览器cookie @RequestMapping("/get") public String get(String object){ return tokenService.get(object); } //http如何传递? 放在请求头里面 最好建议请求头里面 }
运行访问
怎么刷新都能获取到哦
redis 在服务器集群的时候 分布式缓存可以共享
-
redis+session+token实现单点登录_基于Session共享的方式解决单点登录问题
2021-01-24 22:50:19本文主要讲述集群环境下解决Session共享的问题,从而实现集群环境下的单点登录。Session共享问题已经有很多解决方案,这里主要讲述常用四种方法。Session StickySession Sticky(粘性) 保证同一个会话的请求都在同一...本文主要讲述集群环境下解决Session共享的问题,从而实现集群环境下的单点登录。Session共享问题已经有很多解决方案,这里主要讲述常用四种方法。
Session Sticky
Session Sticky(粘性) 保证同一个会话的请求都在同一个Web服务器上处理,这样就完全不需要考虑到会话问题了。比如负载均衡算法中哈希算法就是一个典型的Session Sticky实现手段。
这种实现方式存在问题:
1)如果一台Web服务器宕机或者重启,那么这台机器上保存的会话数据都会丢失,会造成用户暂时无法访问的问题,之前的授权操作需要再执行一次;
2)通过这种方式实现的Session保持,无法进行4层网络转发,只能在7层网络上进行解析并转发。
Session Replication
Session Replication(复制)通过相关技术实现Session复制,使集群中的各个服务器保存所有节点的session数据。tomcat本身就可以实现session复制的功能,基于IP组播放方式。
这种实现方式的问题:
1)同步Session数据会造成网络开销,随着集群规模越大,同步Session带来的带宽影响也越大;
2)每个节点需要保存集群中所有节点的Session数据,就需要比较大的内存来存储。
Session统一存储
集群中的各个节点的Session数据,统一存储到一个存储设备中。客户端访问需要Session的时候,就不是从某个节点的内存中去获得,而是从相应的第三方存储中去获取。对于这个方案来说,无论是哪个节点新增或者修改了Session数据,最终都会发生在这个集中存储的地方。采用的Session存储有redis、mysql。
这种实现方式的问题:
1)读写Session数据需要进行网络操作,存在不稳定性和延迟性;
2)如果存储Session的服务器出现故障,将大规模的影响到应用。
Cookie Based
Cookie Based方法简单来说,就是不依赖容器本身的Session机制。而是服务端基于一定的算法,生成一个token给到客户端,客户端每次请求都会携带这个token。当服务端收到token 以后,先验证token是否有效,然后对客户端访问进行授权。
比较典型的方式是JWT(JSON Web Tokens),它是一种简洁的并且在两个计算机之间安全传递信息的表述性声明规范。JWT的声明一般被用来在客户端和服务端之间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。
-
解决springboot实现跨域session共享问题
2019-01-25 15:39:12解决springboot实现跨域session共享问题,防止sql注入。可以更有效的解决token问题,欢迎下载,有问题可以再评论下方留言,及时解答!!加群:687942640 -
分布式session共享解决方案
2019-04-08 13:59:301使用spring-session + redis 2nginx ip_hash 3cookie 4tomcat配置session共享 5使用token1使用spring-session + redis
2nginx ip_hash
3cookie
4tomcat配置session共享
5使用token
-
Session共享问题有哪些解决方案?
2018-09-07 01:08:094、使用nginx负载均衡策略,ip_hash绑定,不存在session共享问题 5、使用数据库同步session,对数据库有压力 6、tomcat配置session共享 利用cookie同步session数据原理图如下 缺点:安全性差... -
session理论以及解决分布式系统下的session共享问题
2017-11-20 11:59:13一、广义的session 二、可以理解为一种保存key-value的机制...从key的方面看有两种:sessionId和token 1、sessionId很常见,客户端请求服务端的时候,服务端通过 set cookie就可以在http头里面这个sessionId设置key -
Tomcat7基于Redis的Session共享
2019-06-11 11:10:00单点登录,接口调用,分布式系统,退出时需要调用接口,通过token找到sessionId,但是没有session,需要寻找session,使session失效。 解决办法: 登录时,将token和sessionId放入redis中,key=token value=... -
Session跨域共享及SSO解决方案实战
2021-03-09 23:14:093.2 Nginx Session共享 3.3 Token + Redis + Cookie机制 3.4 Spring Security Oauth2 4、开源项目CAS应用 4.1 CAS简介 4.2 下载CAS Server并构建 4.3 CAS Server部署 4.4 CAS客户端项目 4.5 拓展 1、什么是... -
彻底弄懂session,cookie,token及附带负载均衡集群中的session解决方案
2021-03-20 20:05:36前笔者基于拍黄片、python总结了session共享方案 另行补充几种java实现session分布式共享的方案。 session,cookie和token究竟是什么 简述 我在写之前看了很多篇session,cookie的文章,有的人说先有了cookie... -
通过redis使双系统session共享的解决思路
2017-05-11 11:19:592.共享登录逻辑流程(不使用session) A登录时,生成一个随机码token,例如UUID 将token做为key,userId做为value,存入redis,设置过期时间 将token存入cookie,设置过期时间,设置domain A,B系统通过cookie获取token,然后从... -
spring session和mongoDB实现分布式session共享
2018-01-05 20:04:24spring session和mongoDB实现分布式session共享研究背景一方面是因为我们做token验证的时候是在zuul网关这边做的,用户认证通过后,需要对token的刷新来模拟session的功能,但遇到刷新后的值不能直接返回给浏览器的... -
简单描述session共享问题
2020-07-26 16:31:35二、使用token代替session 两种方案开展起来都比较容易,个人推荐第二种。 不过今天我要讲解的是第一种。 1.引入pom <dependency> <groupId>org.springframework.session</groupId> <... -
Cookie、Session、Token
2019-12-17 16:36:24Cookie、Session、Token Cookie是存储在客户端的 ... Session会引发一个问题,即后端多台机器时Session共享的问题,解决方案可以使用Spring提供的框架。 Token类似一个令牌,无状态的,服务端所需的信息被Ba... -
分布式下的session和token
2019-08-06 14:44:15分布式架构下的session和token 我们已经知道session时有状态的,一般存于服务器内存或硬盘中,当服务器采用分布式或集群时,session就会面对负载均衡问题。...当今的几种解决session负载均衡的方法。 而t... -
springboot中session如何共享
2019-03-15 11:57:25springboot+Redis 解决session共享问题 分布式项目现在遍地都是了,但同时也带来一个问题,那就是session共享的问题,将项目分布了以后,不可能每一个都登录一遍,顾客体验极其不好,那么只有一个办法了,session... -
多Web服务器之间共享Session的解决方案
2019-09-29 11:38:57一、提出问题:为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>...二、解决方案:1. 写客户端Cookie的方式 当用户登陆成功以后,把网站域名、用户名、密码、token、 session有效时间... -
Tomcat下多项目Session共享
2015-08-21 02:38:37一、提出问题:为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web...二、解决方案:1. 写客户端Cookie的方式 当用户登陆成功以后,把网站域名、用户名、密码、token、 session有效时间全部采用co... -
cookie,session,token
2020-11-30 11:18:41为了解决这一共享信息的问题,就有(sessionid),浏览器为每个用户生成一个不一样的随机字符串,保存在客户端,每次想服务器发送请求的时候,就来验证一个这个字符串,这样就能 区分账号,这样就有了cookie,---》... -
java结合wabacus实session共享(第三版)
2018-12-13 18:35:07已经是第三版了,只为解决一个问题:先进入wabacus服务,再进入springboot服务时系统退出登录。...如果不给wabacus工程配置sessionCookiePath,将无法实现session共享。 解决办法:给wabacus工程的sessionCookiePa... -
接口鉴权之cookie,session,token
2020-06-06 16:54:41服务器不需要记录信息,所以无状态协议http足够应对(本次请求和上一次请求没有关系,不能共享信息),现在的web要求比如登录才能查看信息,所以就有了会话标识(sessionid) ,用来解决共享信息的问题, 当然session...