最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Redis實現(xiàn)JWT令牌主動失效機(jī)制

 更新時間:2024年08月12日 10:47:05   作者:記得開心一點嘛  
JWT是一種輕量級的身份驗證和授權(quán)機(jī)制,它是一種 JSON 格式的數(shù)據(jù)串,通常用于客戶端和服務(wù)端之間的單點登錄(Single Sign-On, SSO)場景,本文給大家介紹了如何使用Redis來實現(xiàn)JWT令牌主動失效機(jī)制,需要的朋友可以參考下

一.實現(xiàn)思路:

  • 登錄成功后,給瀏覽器響應(yīng)令牌的同時,把該令牌存儲到Redis中
  • LoginInterceptor攔截器中,需要驗證瀏覽器攜帶的令牌,并同時需要獲取到Redis中的存儲的與之相同的令牌,如果獲取到證明令牌有效,如果沒有獲取到則令牌無效
  • 當(dāng)用戶修改密碼成功后,刪除Redis中存儲的舊令牌

二.實現(xiàn)代碼解析:

1.首先配置Redis的相關(guān)配置文件:

(1)pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2)在application.yml中配置相關(guān)信息:

spring:
  data:
    redis:
      host: localhost
      port: 6379
      password: *******  #Redis的密碼
      database: ***      #指定使用哪個數(shù)據(jù)源(可不寫,但默認(rèn)是DB0)

(3)編寫配置類,創(chuàng)建RedisTemplate對象:

我們使用RedisTemplate這個類對象內(nèi)封裝的方法來操作Redis,所以我們在配置類內(nèi)創(chuàng)建RedisTemplate并用Bean注解將其交給Spring容器管理。

@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("開始創(chuàng)建Redis模板對象...0");
        RedisTemplate redisTemplate = new RedisTemplate();
        //設(shè)置redis的連接工廠對象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //設(shè)置redis key的序列化器,這里反應(yīng)的是Redis圖形化工具上value值的不同
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

2.登錄成功后,給瀏覽器響應(yīng)令牌的同時,把該令牌存儲到Redis中:

@RestController
@RequestMapping("/user")
@Validated
public class UserController {
 
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;
 
    /**
     * 用戶登錄
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username ,@Pattern(regexp = "^\\S{5,16}$") String password){
        //根據(jù)username查詢用戶
        User loginUser = userService.findByUserName(username);
        //判斷是否存在
        if(loginUser == null){
            return Result.error("用戶名錯誤");
        }
        //判斷密碼是否正確
        if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){
            //登錄成功,創(chuàng)建JWT令牌
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",loginUser.getId());
            claims.put("username",loginUser.getUsername());
            String token = JwtUtil.genToken(claims);
            //將token存儲到redis中
            redisTemplate.opsForValue().set(token,token,1, TimeUnit.HOURS);//key,value,時間值,時間單位
            return Result.success(token);
        }
        return Result.error("密碼錯誤");
    }
}

3.LoginInterceptor攔截器中,需要驗證瀏覽器攜帶的令牌,并同時需要獲取到Redis中的存儲的與之相同的令牌:

package com.itheima.bigdealboot.interceptors;
 
 
import com.itheima.bigdealboot.utils.JwtUtil;
import com.itheima.bigdealboot.utils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
 
import java.util.Map;
//攔截器
@Component
public class LoginInterceptor implements HandlerInterceptor {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Override
    public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handle) throws Exception{
        String token = request.getHeader("Authorization"); //Authorization為請求頭的名字
        try {
            //從Redis中國獲取相同的token
            String redisToken = (String) redisTemplate.opsForValue().get(token);
            if(redisToken == null){
                //token已經(jīng)失效,拋出異常
                throw new RuntimeException();
            }
            //令牌驗證
            Map<String,Object> claims = JwtUtil.parseToken(token);
            //線程開辟空間存儲
            ThreadLocalUtil.set(claims);
            //放行
            return true;
        }catch (Exception e){
            //http響應(yīng)狀態(tài)碼為401在·
            response.setStatus(401);
            //不放行
            return false;
        }
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清空線程數(shù)據(jù)
        ThreadLocalUtil.remove();
    }
}

4.當(dāng)用戶修改密碼成功后,刪除Redis中存儲的舊令牌:

@RestController
@RequestMapping("/user")
@Validated
public class UserController {
 
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;
 
    @PatchMapping("/updatePwd")
    public Result updatePwd(@RequestBody Map<String,String> params,@RequestHeader("Authorization") String token){
        //校驗參數(shù)
        String oldPwd = params.get("old_pwd");
        String newPwd = params.get("new_pwd");
        String rePwd = params.get("re_pwd");
        if(StringUtils.hasLength(oldPwd) || StringUtils.hasLength(newPwd) || StringUtils.hasLength(rePwd)){
            return Result.error("缺少必要參數(shù)");
        }
        //校驗
        Map<String,Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        User loginUser = userService.findByUserName(username);
        if(!loginUser.getPassword().equals(Md5Util.getMD5String(oldPwd))){
            return Result.error("原密碼填寫不正確");
        }
        if(!rePwd.equals(newPwd)){
            return Result.error("兩次填寫的新密碼不一樣");
        }
        //更新密碼
        userService.updatePwd(newPwd);
        //刪除redis中對應(yīng)的token
        redisTemplate.opsForValue().getOperations().delete(token);
        return Result.success();
    }
}

到此這篇關(guān)于使用Redis實現(xiàn)JWT令牌主動失效機(jī)制的文章就介紹到這了,更多相關(guān)Redis JWT主動失效機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis的緩存機(jī)制用法及說明

    Redis的緩存機(jī)制用法及說明

    Redis緩存可以有效提高高并發(fā)場景下的數(shù)據(jù)庫性能,通過定期生成熱數(shù)據(jù)、實時生成熱數(shù)據(jù)、緩存淘汰策略以及解決緩存預(yù)熱、穿透、雪崩和擊穿等問題,可以更好地利用Redis緩存
    2026-03-03
  • Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    這篇文章主要介紹了Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié),本文分別對String 類型的一些方法和Hash 類型做了詳細(xì)介紹,需要的朋友可以參考下
    2015-06-06
  • Redis shake實現(xiàn)可視化監(jiān)控的示例代碼

    Redis shake實現(xiàn)可視化監(jiān)控的示例代碼

    Redis可視化監(jiān)控是通過監(jiān)控Redis服務(wù)器的各項指標(biāo)和狀態(tài),并將其以可視化的方式展示給用戶,本文給大家介紹了Redis shake實現(xiàn)可視化監(jiān)控,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案

    Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案

    本文主要介紹了Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 淺談Redis在直播場景的實踐方案

    淺談Redis在直播場景的實踐方案

    這篇文章主要介紹了淺談Redis在直播場景的實踐方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Redis概述及l(fā)inux安裝redis的詳細(xì)教程

    Redis概述及l(fā)inux安裝redis的詳細(xì)教程

    這篇文章主要介紹了Redis概述及l(fā)inux安裝redis的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 基于Redis的分布式鎖及原子性問題(短視頻開發(fā))

    基于Redis的分布式鎖及原子性問題(短視頻開發(fā))

    短視頻開發(fā)中,Redis分布式鎖通過SETNX實現(xiàn)加鎖與解鎖,需設(shè)置超時時間避免死鎖,為防止誤刪,釋放鎖時需判斷線程身份,并用Lua腳本保證原子性,確保安全操作,本文給大家介紹基于Redis的分布式鎖及原子性問題,感興趣的朋友一起看看吧
    2025-06-06
  • 巧用Redis實現(xiàn)分布式鎖詳細(xì)介紹

    巧用Redis實現(xiàn)分布式鎖詳細(xì)介紹

    大家好,本篇文章主要講的是巧用Redis實現(xiàn)分布式鎖詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 基于Redis實現(xiàn)共享Session登錄的實現(xiàn)

    基于Redis實現(xiàn)共享Session登錄的實現(xiàn)

    本文主要介紹了基于Redis實現(xiàn)共享Session登錄的實現(xiàn),包括發(fā)送短信驗證碼、短信驗證碼登錄和注冊、以及登錄狀態(tài)校驗的流程,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Redis 事務(wù)知識點相關(guān)總結(jié)

    Redis 事務(wù)知識點相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下
    2021-03-03

最新評論

义马市| 安塞县| 阳朔县| 渑池县| 大冶市| 定日县| 沙坪坝区| 民勤县| 南昌市| 磐安县| 襄樊市| 秭归县| 福海县| 池州市| 革吉县| 玛多县| 西盟| 宜川县| 高要市| 灵璧县| 屏东县| 元氏县| 扶沟县| 霸州市| 乳山市| 望谟县| 大新县| 轮台县| 衡南县| 保德县| 邹城市| 陈巴尔虎旗| 黄冈市| 庆城县| 三江| 丰镇市| 天全县| 宝鸡市| 乐亭县| 清流县| 扎赉特旗|