基於令牌(Token)方式實現Session解決方案,由於Session自己就是分佈式共享鏈接html
用token代替sessionjava
廢話很少說,看項目:web
pom.xmlredis
<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>
ymlspring
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
redisapache
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的封裝json
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 在服務器集羣的時候 分佈式緩存能夠共享