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

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

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

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

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

加依賴

    <dependency>
         <groupId>io.jsonwebtoken</groupId>
         <artifactId>jjwt</artifactId>
         <version>0.9.1</version> <!-- 請根據(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ù)為默認的
     * @return
     */
    public static String generateJWT() {
        return generateJWT(DEFAULT_PLAIN_TEXT, DEFAULT_TTL);
    }
 
    /**
     * 傳入JSON對象生成令牌
     * @param subject
     * @return
     */
    public static String generateJWT(String subject) {
        return generateJWT(subject, DEFAULT_TTL);
    }
 
    /**
     * token 生成器
     * @param subject 信息
     * @param ttlMillis 有效時間
     * @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對象
                .setIssuer("dabaimao") //簽發(fā)人
                .setIssuedAt(now) //簽發(fā)時間
                .signWith(signatureAlgorithm, secretKey) // 使用密鑰進行簽名
                .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 對象
     * @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)頁解析token,網(wǎng)址https://jwt.io
        System.out.println("解析token得到的數(shù)據(jù): "+analysisJWT(jwtToken).toString());
    }
}

結(jié)果如下:

登錄流程

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

攔截器實例

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

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

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

(權限驗證:輕松實現(xiàn)權限驗證

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

這樣就可以了

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

相關文章

  • java中List去除重復數(shù)據(jù)的5種方式總結(jié)

    java中List去除重復數(shù)據(jù)的5種方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關于java中List去除重復數(shù)據(jù)的5種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • JavaWeb實現(xiàn)文件上傳下載功能實例詳解

    JavaWeb實現(xiàn)文件上傳下載功能實例詳解

    這篇文章主要介紹了JavaWeb中的文件上傳和下載功能的實現(xiàn),在開發(fā)中,文件上傳和下載功能是非常常用的功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • IDEA全局查找關鍵字的用法解讀

    IDEA全局查找關鍵字的用法解讀

    這篇文章主要介紹了IDEA全局查找關鍵字的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用Springboot整合Apollo配置中心

    使用Springboot整合Apollo配置中心

    這篇文章主要介紹了使用Springboot整合Apollo配置中心的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一鍵部署SpringCloud 微服務的詳細流程

    一鍵部署SpringCloud 微服務的詳細流程

    本文詳解通過Jenkins、K8s、Docker實現(xiàn)SpringCloud微服務自動化部署流程,涵蓋SSH密鑰配置、代碼拉取構(gòu)建、鏡像打包推送及K8s資源發(fā)布,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • 基于Socket類以及ServerSocket類的實例講解

    基于Socket類以及ServerSocket類的實例講解

    下面小編就為大家?guī)硪黄赟ocket類以及ServerSocket類的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 淺析java中String類型中“==”與“equal”的區(qū)別

    淺析java中String類型中“==”與“equal”的區(qū)別

    這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • datax-web在windows環(huán)境idea中模塊化打包部署操作步驟

    datax-web在windows環(huán)境idea中模塊化打包部署操作步驟

    這篇文章主要介紹了datax-web在windows環(huán)境idea中模塊化打包部署操作步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Lombok之@AllArgsConstructor的使用方式

    Lombok之@AllArgsConstructor的使用方式

    這篇文章主要介紹了Lombok之@AllArgsConstructor的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java通過cglib動態(tài)生成實體bean的操作

    java通過cglib動態(tài)生成實體bean的操作

    這篇文章主要介紹了java通過cglib動態(tài)生成實體bean的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

板桥市| 赤水市| 金昌市| 京山县| 博爱县| 石家庄市| 壶关县| 札达县| 永安市| 昆明市| 天水市| 文安县| 星子县| 郯城县| 九台市| 葫芦岛市| 静海县| 三河市| 五华县| 洛隆县| 青州市| 宁海县| 杭锦旗| 衡山县| 衡阳县| 广灵县| 庄河市| 红原县| 建瓯市| 深水埗区| 景德镇市| 宜宾市| 武宁县| 平罗县| 康乐县| 曲水县| 盐池县| 昭苏县| 林口县| 诸城市| 云和县|