分布式session之token解决方案实现

痛定思痛。 2022-01-28 13:19 634阅读 0赞

分布式session之token解决方案实现

基于令牌(Token)方式实现Session解决方案,因为Session本身就是分布式共享连接

用token代替session

废话不多说,看项目:

1179709-20181104155421397-500107772.png

pom.xml

  1. <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">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId> com.toov5.tokenSession</groupId>
  4. <artifactId>tokenSession</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.0.0.RELEASE</version>
  10. <relativePath /> <!-- lookup parent from repository -->
  11. </parent>
  12. <properties>
  13. <weixin-java-mp.version>2.8.0</weixin-java-mp.version>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.build.locales>zh_CN</project.build.locales>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.projectlombok</groupId>
  23. <artifactId>lombok</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId>
  29. <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> -->
  30. </dependency>
  31. <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
  32. <dependency>
  33. <groupId>com.alibaba</groupId>
  34. <artifactId>fastjson</artifactId>
  35. <version>1.2.47</version>
  36. </dependency>
  37. <!-- Testing Dependencies -->
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-data-redis</artifactId>
  46. </dependency>
  47. <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
  48. <dependency>
  49. <groupId>org.springframework.session</groupId>
  50. <artifactId>spring-session-data-redis</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.apache.commons</groupId>
  54. <artifactId>commons-pool2</artifactId>
  55. </dependency>
  56. <dependency>
  57. <groupId>redis.clients</groupId>
  58. <artifactId>jedis</artifactId>
  59. </dependency>
  60. </dependencies>
  61. <build>
  62. <plugins>
  63. <plugin>
  64. <groupId>org.apache.maven.plugins</groupId>
  65. <artifactId>maven-compiler-plugin</artifactId>
  66. <configuration>
  67. <source>1.8</source>
  68. <target>1.8</target>
  69. </configuration>
  70. </plugin>
  71. <plugin>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-maven-plugin</artifactId>
  74. <configuration>
  75. <maimClass>com.meiteedu.WxMpApplication</maimClass>
  76. </configuration>
  77. <executions>
  78. <execution>
  79. <goals>
  80. <goal>repackage</goal>
  81. </goals>
  82. </execution>
  83. </executions>
  84. </plugin>
  85. </plugins>
  86. </build>
  87. </project>

 yml

  1. server:
  2. port: 8081
  3. spring:
  4. redis:
  5. database: 0
  6. host: 192.168.91.3
  7. port: 6379
  8. password: 123
  9. jedis:
  10. pool:
  11. max-active: 8
  12. max-wait: -1
  13. max-idle: 8
  14. min-idle: 0
  15. timeout: 10000
  16. redis:
  17. hostname: 192.168.91.3
  18. port: 6379
  19. password: 123

  redis

  1. package com.toov5.service;
  2. import java.util.Set;
  3. import java.util.concurrent.TimeUnit;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.data.redis.core.StringRedisTemplate;
  6. import org.springframework.stereotype.Component;
  7. @Component
  8. public class RedisService {
  9. @Autowired
  10. private StringRedisTemplate stringRedisTemplate;
  11. //这样该方法支持多种数据类
  12. public void set(String key , Object object, Long time){
  13. if (object instanceof String ) { //判断下是String类型�?
  14. String argString =(String)object; //强转�?
  15. //存放String类型
  16. stringRedisTemplate.opsForValue().set(key, argString);
  17. }
  18. //如果存放Set类型
  19. if (object instanceof Set) {
  20. Set<String> valueSet =(Set<String>)object;
  21. for(String string:valueSet){
  22. stringRedisTemplate.opsForSet().add(key, string); //此处点击下源码看 第二个参数可以放好多
  23. }
  24. }
  25. //设置有效�
  26. if (time != null) {
  27. stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
  28. }
  29. }
  30. //做个封装
  31. public void setString(String key, Object object){
  32. String argString =(String)object; //强转
  33. //存放String类型
  34. stringRedisTemplate.opsForValue().set(key, argString);
  35. }
  36. public void setSet(String key, Object object){
  37. Set<String> valueSet =(Set<String>)object;
  38. for(String string:valueSet){
  39. stringRedisTemplate.opsForSet().add(key, string); //此处点击下源码看 第二个参数可以放好多
  40. }
  41. }
  42. public String getString(String key){
  43. return stringRedisTemplate.opsForValue().get(key);
  44. }
  45. }

token的封装

  1. package com.toov5.service;
  2. import java.util.UUID;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import ch.qos.logback.core.subst.Token;
  6. @Service
  7. public class TokenService {
  8. @Autowired
  9. private RedisService redisService;
  10. // 1 使用token方式替代session功能
  11. //存入和获取
  12. public String put(Object value){
  13. //判断您是否为空
  14. if (value == null) {
  15. return null;
  16. }
  17. // 先生成对应的token(token 实际上等于key)
  18. String token = getToken();
  19. //存入在redis中
  20. redisService.setString(token, value);
  21. //直接返回对应的token
  22. return token;
  23. }
  24. public String get(String token){
  25. return redisService.getString(token);
  26. }
  27. public String getToken(){
  28. return UUID.randomUUID().toString();
  29. }
  30. }

controller

  1. package com.toov5.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import com.toov5.service.TokenService;
  6. @RestController
  7. public class TestTokenController {
  8. @Autowired
  9. private TokenService tokenService;
  10. //使用token方式替代session sessiong服务器端创session 返回sessionid
  11. @RequestMapping("/put")
  12. public String put(String value){
  13. String string = tokenService.put(value);
  14. System.out.println(string);
  15. return string;
  16. }
  17. //生成好的token如何存放? 移动端存放本地文件 浏览器cookie
  18. @RequestMapping("/get")
  19. public String get(String object){
  20. return tokenService.get(object);
  21. }
  22. //http如何传递? 放在请求头里面 最好建议请求头里面
  23. }

运行访问

1179709-20181104160104778-1028157604.png

怎么刷新都能获取到哦

1179709-20181104160155586-113585306.png

redis 在服务器集群的时候 分布式缓存可以共享

发表评论

表情:
评论列表 (有 0 条评论,634人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一种分布式session实现方案

    一种分布式session实现方案:当服务器的访问压力达到一定程度时,会采用分布式部署方案,即分布式集群部署,多个服务节点都可以提供同样的服务能力。 这样,当大量的ht