數(shù)據(jù)接口的訪問有時常常和和身份唯一合法驗證有關(guān)楼咳。
1.通過session來控制
1.1 控制方式
傳統(tǒng)做法通過session識別身份硫朦,具體步驟
- 1苟跪、通過過濾器攔截請求状共,判斷用戶session是否存在亲配。登陸等模塊不需要驗證身份的特殊處理尘应。
- 2惶凝、通過攔截器攔截方法,判斷用戶session是否存在犬钢,不需要驗證登陸加載苍鲜,通過auth自定義注解區(qū)分。此法優(yōu)于1玷犹。
以上兩種方法適合簡單早期的應(yīng)用,如遇到應(yīng)用系統(tǒng)集群混滔,需要解決session共享的問題。又如接口同時提供對外訪問歹颓∨饔欤總不能特殊處理再重寫一下吧?
1.2 session共享方式
spring boot項目使用tomcat服務(wù)器實現(xiàn)session共享的方式巍扛,使用redis存儲session對象值
(1)添加依賴
<!--使用redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--session 共享 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
(2)在yml中配置redis
spring:
redis:
password: 123456
pool:
max-active: 21
max-idle: 8
max-wait: -1
min-idle: 0
sentinel:
master: sentinel-name
nodes: 192.168.1.2:6389,192.168.1.3:6390,192.168.1.4:6387
timeout: 1000
此處配置完全是spring-boot-starter-data-redis相關(guān)配置參數(shù)领跛,跟spring-session-data-redis無關(guān)。后者依賴前者
(3)在項目啟動類上添加如下注解@EnableRedisHttpSession
通過@EnableRedisHttpSession注解開啟Session共享功能
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600, flushMode = FlushMode.ON_SAVE)
public class RedisCacheConfig
{
}
注解的主要作用是注冊一個SessionRepositoryFilter撤奸,這個Filter會攔截到所有的請求吠昭,對Session進行操作
2.通過請求中攜帶cookie或者head身份信息
思路一:
- 登陸成功后,服務(wù)器產(chǎn)生token(生成規(guī)則自定:IP+瀏覽器類型+時間)令牌寂呛,返回到客戶端token和用戶ID(加密)怎诫。服務(wù)器把toke 對應(yīng)的用戶信息存放session中。
- 攔截器接收token贷痪,通過session從服務(wù)器中獲取相應(yīng)的用戶信息,如果沒有獲得(session失效或者服務(wù)器不同),則根據(jù)用戶ID后臺自動登錄蹦误,用戶信息再放到session里面劫拢。
重點:請求cookie中攜帶token和id
思路二:
- 登錄成功后,服務(wù)產(chǎn)生token(生成規(guī)則:時間 )令牌强胰,令牌存放在redis緩存并且存放在登錄信息表舱沧。令牌通過head返回。
- 客戶端訪問服務(wù)器偶洋,攔截器接受token熟吏,解析token并驗證是否過期,從redis讀取token