分佈式session之token解決方案實現

基於令牌(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 在服務器集羣的時候 分佈式緩存能夠共享

相關文章
相關標籤/搜索