1. 程式人生 > 其它 >qq空間登陸 cookie_精:基於token的登陸驗證機制

qq空間登陸 cookie_精:基於token的登陸驗證機制

Spring Data Redis

新增依賴:Spring Data Redis + 連線池(commos-pool2)

        <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-redis</artifactId>
       </dependency>
       <dependency>
           <groupId>org.apache.commons</groupId>
           <artifactId>commons-pool2</artifactId>
           <version>2.8.0</version>
       </dependency>

配置Redis資訊

spring.redis.database=0
spring.redis.password=123
spring.redis.port=6379
spring.redis.host=127.0.0.1
spring.redis.lettuce.pool.min-idle=5
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1ms
spring.redis.lettuce.shutdown-timeout=100ms

Spring Boot 中 Redis 的自動化配置類

@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
   public RedisAutoConfiguration() {
  }

   @Bean
   @ConditionalOnMissingBean(
       name = {"redisTemplate"}
  )
   public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
       RedisTemplate<Object, Object> template = new RedisTemplate();
       template.setConnectionFactory(redisConnectionFactory);
       return template;
  }

   @Bean
   @ConditionalOnMissingBean
   public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
       StringRedisTemplate template = new StringRedisTemplate();
       template.setConnectionFactory(redisConnectionFactory);
       return template;
  }
}

自動化配置類理解:

  1. 首先標記這個是一個配置類,同時該配置在 RedisOperations 存在的情況下才會生效(即專案中引入了 Spring Data Redis)

  2. 然後匯入在 application.properties 中配置的屬性

  3. 然後再匯入連線池資訊(如果存在的話)

  4. 最後,提供了兩個 Bean ,RedisTemplate 和 StringRedisTemplate ,其中 StringRedisTemplate 是 RedisTemplate 的子類,兩個的方法基本一致,不同之處主要體現在操作的資料型別不同,RedisTemplate 中的兩個泛型都是 Object ,意味者儲存的 key 和 value 都可以是一個物件,而 StringRedisTemplate 的 兩個泛型都是 String ,意味者 StringRedisTemplate 的 key 和 value 都只能是字串。如果開發者沒有提供相關的 Bean ,這兩個配置就會生效,否則不會生效

Redis 中的資料操作,大體上來說,可以分為兩種:

  1. 針對 key 的操作,相關的方法就在 RedisTemplate 中

  2. 針對具體資料型別的操作,相關的方法需要首先獲取對應的資料型別,獲取相應資料型別的操作方法是 opsForXXX

Spring Boot 的自動化配置,只能配置單機的 Redis ,如果是 Redis 叢集,則所有的東西都需要自己手動配置

 

session共享

在傳統的單服務架構中,一般來說,只有一個伺服器,那麼不存在 Session 共享問題,但是在分散式/叢集專案中,Session 共享則是一個必須面對的問題

Spring Session 就是使用 Spring 中的代理過濾器,將所有的 Session 操作攔截下來,自動的將資料 同步到 Redis 中,或者自動的從 Redis 中讀取資料。

對於開發者來說,所有關於 Session 同步的操作都是透明的,開發者使用 Spring Session,一旦配置完成後,具體的用法就像使用一個普通的 Session 一樣

  • 新增依賴,使用 Spring Boot2.1.5及以上的話,除了上面這些依賴之外,需要額外新增 Spring Security 依賴(其他操作不受影響,僅僅只是多了一個依賴,當然也多了 Spring Security 的一些預設認證流程)

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-data-redis</artifactId>
</dependency>
  • 配置Redis資訊

  • 使用,配置完成後 ,就可以使用 Spring Session 了,其實就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已經自動幫你完成了

@RestController
public class HelloController {
   @Value("${server.port}")
   Integer port;
   
   @GetMapping("/set")
   public String set(HttpSession session) {
       session.setAttribute("user", "javaboy");

       return String.valueOf(port);
  }
   @GetMapping("/get")
   public String get(HttpSession session) {
       return session.getAttribute("user") + ":" + port;
  }
}

使用兩個埠啟動兩個服務,訪問兩個服務能獲取同一session

  • 引入Nginx

進入 Nginx 的安裝目錄的 conf 目錄下(預設是在 /usr/local/nginx/conf),編輯 nginx.conf 檔案:

img

在這段配置中:

  1. upstream 表示配置上游伺服器

  2. javaboy.org 表示伺服器叢集的名字,這個可以隨意取名字

  3. upstream 裡邊配置的是一個個的單獨服務

  4. weight 表示服務的權重,意味者將有多少比例的請求從 Nginx 上轉發到該服務上

  5. location 中的 proxy_pass 表示請求轉發的地址, / 表示攔截到所有的請求,轉發轉發到剛剛配置好的服務叢集中

  6. proxy_redirect 表示設定當發生重定向請求時,nginx 自動修正響應頭資料(預設是 Tomcat 返回重定向,此時重定向的地址是 Tomcat 的地址,我們需要將之修改使之成為 Nginx 的地址)。

配置完成後,將本地的 Spring Boot 打包好的 jar 上傳到 Linux ,然後在 Linux 上分別啟動兩個 Spring Boot服務