欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)Token工具類進(jìn)行登錄和攔截

 更新時(shí)間:2023年12月17日 16:54:50   作者:大白貓~  
在應(yīng)用的登錄時(shí)需要生成token進(jìn)行驗(yàn)證,并放入信息,之后的話可以直接使用瀏覽器的session進(jìn)行登錄,本文就來(lái)利用java編寫一個(gè)token工具類,可以很方便的生成和解析token,感興趣的可以了解下

在應(yīng)用的登錄時(shí)需要生成token進(jìn)行驗(yàn)證,并放入信息,之后的話可以直接使用瀏覽器的session(有時(shí)候可能會(huì)出現(xiàn)session共享以及丟失問(wèn)題,這個(gè)時(shí)候可以使用Redis因?yàn)镽edis一般集群)進(jìn)行登錄,獲取信息,進(jìn)行直接登錄

這邊寫了一個(gè)token工具類,可以很方便的生成和解析token,代碼如下

加依賴

    <dependency>
         <groupId>io.jsonwebtoken</groupId>
         <artifactId>jjwt</artifactId>
         <version>0.9.1</version> <!-- 請(qǐng)根據(jù)最新版本更新 -->
    </dependency>

寫工具類

public class JwtUtils {
 
    public static final long DEFAULT_TTL = 30 * 24 * 60 * 60 * 1000L; // 30天
 
    public static final String DEFAULT_PLAIN_TEXT = "dbmzlh";
 
    /**
     * 生成UUID,也可以為雪花算法
     * @return
     */
    public static String generateUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
 
    /**
     * 生成token令牌,數(shù)據(jù)為默認(rèn)的
     * @return
     */
    public static String generateJWT() {
        return generateJWT(DEFAULT_PLAIN_TEXT, DEFAULT_TTL);
    }
 
    /**
     * 傳入JSON對(duì)象生成令牌
     * @param subject
     * @return
     */
    public static String generateJWT(String subject) {
        return generateJWT(subject, DEFAULT_TTL);
    }
 
    /**
     * token 生成器
     * @param subject 信息
     * @param ttlMillis 有效時(shí)間
     * @return 令牌
     */
    public static String generateJWT(String subject, Long ttlMillis) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey(); // 生成適用于 HMAC 的密鑰
 
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if (ttlMillis == null) {
            ttlMillis = DEFAULT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
 
        return Jwts.builder()
                .setId(generateUUID()) //唯一ID
                .setSubject(subject) //JSON對(duì)象
                .setIssuer("dabaimao") //簽發(fā)人
                .setIssuedAt(now) //簽發(fā)時(shí)間
                .signWith(signatureAlgorithm, secretKey) // 使用密鑰進(jìn)行簽名
                .setExpiration(expDate)
                .compact();
    }
 
    /**
     * 使用AES算法生成公私鑰
     * @return
     */
    public static SecretKey generalKey()
    {
        byte[] encodedKey = Base64.getDecoder().decode(DEFAULT_PLAIN_TEXT.replace("\r\n", ""));
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    }
 
    /**
     * 解析token令牌
     * @param jwt 令牌
     * @return 對(duì)象
     * @throws Exception
     */
    public static Claims analysisJWT(String jwt) throws Exception
    {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
 
    public static void main(String[] args) throws Exception {
        String jwtToken = generateJWT("大白貓真厲害", DEFAULT_TTL);
        System.out.println("登錄成功生成的token: " + jwtToken);
?        //也可以網(wǎng)頁(yè)解析token,網(wǎng)址https://jwt.io
        System.out.println("解析token得到的數(shù)據(jù): "+analysisJWT(jwtToken).toString());
    }
}

結(jié)果如下:

登錄流程

第一次登錄后前端將登錄成功返回的token放到session中,之后每一次登錄都攜帶session,到服務(wù)器解析生成對(duì)應(yīng)的登錄者數(shù)據(jù),可以查詢數(shù)據(jù)庫(kù)并執(zhí)行將數(shù)據(jù)放到Redis的一些操作,后端可以使用網(wǎng)關(guān)的過(guò)濾以及攔截去實(shí)現(xiàn)登錄功能

攔截器實(shí)例

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(new ToKenFilter())
                 .addPathPatterns("","") //攔截那些路徑
                 .excludePathPatterns(""); //放行那些路徑
    }
}

在TokenFilter中處理邏輯,根據(jù)放入的數(shù)據(jù)查詢Redis找到對(duì)應(yīng)的人物

比如toKen免密登錄解析出為user:001根據(jù)拿到的數(shù)據(jù)去數(shù)據(jù)庫(kù)查詢?nèi)宋镄畔?,放到Redis中

(權(quán)限驗(yàn)證:輕松實(shí)現(xiàn)權(quán)限驗(yàn)證

@Component
public class ToKenFilter implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 2. 解碼JWT令牌
        try {
            // 1. 從HTTP請(qǐng)求頭部獲取JWT令牌
            String jwtToken = request.getHeader("token");
 
            // 請(qǐng)?zhí)鎿Q下面的方法和密鑰為你實(shí)際使用的JWT庫(kù)和密鑰
            Claims claims = JwtUtils.analysisJWT(jwtToken);
 
            // 3. 驗(yàn)證JWT令牌
            // 3.1 簽名驗(yàn)證已經(jīng)在解碼中完成
            // 3.2 過(guò)期驗(yàn)證
            Date expirationDate = claims.getExpiration();
            Date now = new Date();
            if (expirationDate.before(now)) {
                // 令牌已過(guò)期,發(fā)送錯(cuò)誤響應(yīng)
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return false;
            }
 
            // 3.3 權(quán)限驗(yàn)證,根據(jù)需要執(zhí)行
 
        } catch (Exception e) {
            // 令牌無(wú)效或解碼失敗,發(fā)送錯(cuò)誤響應(yīng)
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
 
        // 驗(yàn)證通過(guò),返回true,請(qǐng)求繼續(xù)到達(dá)控制器方法
        return true;
    }
}

這樣就可以了

到此這篇關(guān)于Java實(shí)現(xiàn)Token工具類進(jìn)行登錄和攔截的文章就介紹到這了,更多相關(guān)Java Token登錄和攔截內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的

    Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的

    今天帶大家學(xué)習(xí)java隊(duì)列的相關(guān)知識(shí),文章圍繞著如何實(shí)現(xiàn)Java動(dòng)態(tài)循環(huán)隊(duì)列展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java線程池配置的一些常見(jiàn)誤區(qū)總結(jié)

    Java線程池配置的一些常見(jiàn)誤區(qū)總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java線程池配置的一些常見(jiàn)誤區(qū),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MyBatis傳入數(shù)組集合類并使用foreach遍歷

    MyBatis傳入數(shù)組集合類并使用foreach遍歷

    這篇文章主要介紹了MyBatis傳入數(shù)組集合類并使用foreach遍歷,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot3使用Jasypt加密數(shù)據(jù)庫(kù)用戶名、密碼等敏感信息

    SpringBoot3使用Jasypt加密數(shù)據(jù)庫(kù)用戶名、密碼等敏感信息

    使用Jasypt(Java Simplified Encryption)進(jìn)行數(shù)據(jù)加密和解密主要涉及幾個(gè)步驟,包括引入依賴、配置加密密碼、加密敏感信息、將加密信息存儲(chǔ)到配置文件中,以下是詳細(xì)的使用說(shuō)明,需要的朋友可以參考下
    2024-07-07
  • spring framework源碼調(diào)試技巧

    spring framework源碼調(diào)試技巧

    這篇文章給大家介紹了spring-framework源碼調(diào)試方法,可以直接將最新代碼clone到本地,如果想在代碼做一些注釋,也可以Fork到自己的倉(cāng)庫(kù)。本文采用Fork的方式,并添加了測(cè)試module,感興趣的朋友一起看看吧
    2021-10-10
  • mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析

    mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析

    這篇文章主要介紹了mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實(shí)現(xiàn)對(duì)象排序的兩種方式詳解

    Java實(shí)現(xiàn)對(duì)象排序的兩種方式詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)象排序的兩種方式詳解,在Java中經(jīng)常會(huì)涉及到對(duì)象數(shù)組的排序問(wèn)題,則就提到對(duì)象之間的比較問(wèn)題,今天我們就來(lái)看一下兩種不同排序方式之間的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • Spring Boot結(jié)合ECharts案例演示示例

    Spring Boot結(jié)合ECharts案例演示示例

    本文主要主要介紹了Spring Boot結(jié)合ECharts案例演示示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例

    SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例

    這篇文章主要介紹了SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Java的常用包

    Java的常用包

    本文主要對(duì)Java的常用包進(jìn)行一一介紹。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01

最新評(píng)論