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

Java登錄功能實(shí)現(xiàn)token生成與驗(yàn)證

 更新時(shí)間:2021年12月01日 16:51:03   作者:穆晟銘  
這篇文章介紹了Java登錄功能實(shí)現(xiàn)token生成與驗(yàn)證,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、token與cookie相比較的優(yōu)勢(shì)

  • 1、支持跨域訪問(wèn),將token置于請(qǐng)求頭中,而cookie是不支持跨域訪問(wèn)的;
  • 2、無(wú)狀態(tài)化,服務(wù)端無(wú)需存儲(chǔ)token,只需要驗(yàn)證token信息是否正確即可,而session需要在服務(wù)端存儲(chǔ),一般是通過(guò)cookie中的sessionID在服務(wù)端查找對(duì)應(yīng)的session;
  • 3、無(wú)需綁定到一個(gè)特殊的身份驗(yàn)證方案(傳統(tǒng)的用戶名密碼登陸),只需要生成的token是符合我們預(yù)期設(shè)定的即可;
  • 4、更適用于移動(dòng)端(Android,iOS,小程序等等),像這種原生平臺(tái)不支持cookie,比如說(shuō)微信小程序,每一次請(qǐng)求都是一次會(huì)話,當(dāng)然我們可以每次去手動(dòng)為他添加cookie,詳情請(qǐng)查看博主另一篇博客;
  • 5、避免CSRF跨站偽造攻擊,還是因?yàn)椴灰蕾嘽ookie;

二、基于JWT的token認(rèn)證實(shí)現(xiàn)

JWT:JSON Web Token,其實(shí)token就是一段字符串,由三部分組成:Header,Payload,Signature

1、引入依賴

<dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>3.8.2</version>
</dependency>

2、設(shè)置密鑰和生存時(shí)間

//設(shè)置過(guò)期時(shí)間
private static final long EXPIRE_DATE=30*60*100000;
//token秘鑰
private static final String TOKEN_SECRET = "ZCEQIUBFKSJBFJH2020BQWE";

3、實(shí)現(xiàn)簽名方法

public static String token (String username,String password){
 
        String token = "";
        try {
            //過(guò)期時(shí)間
            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
            //秘鑰及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //設(shè)置頭部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //攜帶username,password信息,生成簽名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("username",username)
                    .withClaim("password",password).withExpiresAt(date)
                    .sign(algorithm);
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }

4、驗(yàn)證token

public static boolean verify(String token){
        /**
         * @desc   驗(yàn)證token,通過(guò)返回true
         * @create 2019/1/18/018 9:39
         * @params [token]需要校驗(yàn)的串
         **/
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return  false;
        }
    }

5、測(cè)試

直接用生成的token去驗(yàn)證,成功

public static void main(String[] args) {
       String username ="zhangsan";
        String password = "123";
        String token = token(username,password);
        System.out.println(token);
        boolean b = verify(token);
        System.out.println(b);
    }

三、完整的Token工具類代碼

package xxx.utils; //你的包
 
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
 
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @desc   使用token驗(yàn)證用戶是否登錄
 * @author zm
 **/
public class TokenUtils {
    //設(shè)置過(guò)期時(shí)間
    private static final long EXPIRE_DATE=30*60*100000;
    //token秘鑰
    private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";
 
    public static String token (String username,String password){
 
        String token = "";
        try {
            //過(guò)期時(shí)間
            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
            //秘鑰及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //設(shè)置頭部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //攜帶username,password信息,生成簽名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("username",username)
                    .withClaim("password",password).withExpiresAt(date)
                    .sign(algorithm);
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }
 
    public static boolean verify(String token){
        /**
         * @desc   驗(yàn)證token,通過(guò)返回true
         * @params [token]需要校驗(yàn)的串
         **/
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return  false;
        }
    }
    public static void main(String[] args) {
       String username ="zhangsan";
        String password = "123";
        String token = token(username,password);
        System.out.println(token);
        boolean b = verify("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd22yZCI6IjEyMyIsImV4cCI6MTU3ODE5NzQxMywidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.IyTZT0tISQQZhGhsNuaqHGV8LD7idjUYjn3MGbulmJg");
        System.out.println(b);
    }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Hibernate根據(jù)實(shí)體類自動(dòng)生成表的方法

    使用Hibernate根據(jù)實(shí)體類自動(dòng)生成表的方法

    這篇文章主要介紹了使用Hibernate根據(jù)實(shí)體類自動(dòng)生成表的方法,該篇提供了兩種方法,可以根據(jù)需要選擇其一,希望對(duì)你有所幫助,如有不對(duì)的地方還望指正
    2023-03-03
  • 全面解讀Spring Boot 中的Profile配置體系

    全面解讀Spring Boot 中的Profile配置體系

    配置體系是基于 Spring Boot 框架開(kāi)發(fā)應(yīng)用程序的基礎(chǔ),而自動(dòng)配置也是該框架的核心功能之一。本文梳理Spring Boot 中的Profile配置體系的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • mybatis中返回多個(gè)map結(jié)果問(wèn)題

    mybatis中返回多個(gè)map結(jié)果問(wèn)題

    這篇文章主要介紹了mybatis中返回多個(gè)map結(jié)果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring中存取Bean的相關(guān)注解舉例詳解

    Spring中存取Bean的相關(guān)注解舉例詳解

    這篇文章主要給大家介紹了關(guān)于Spring中存取Bean的相關(guān)注解,在沒(méi)有使用注解獲取對(duì)象之前,我們需要在配置文件中通過(guò)添加bean來(lái)將對(duì)象存儲(chǔ)到Spring容器中,這對(duì)于我們來(lái)說(shuō)是比較麻煩的,需要的朋友可以參考下
    2023-10-10
  • Java快速實(shí)現(xiàn)圖書(shū)管理基本功能

    Java快速實(shí)現(xiàn)圖書(shū)管理基本功能

    隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書(shū)館的日常工作進(jìn)行管理勢(shì)在必行,本篇文章涵蓋一個(gè)圖書(shū)管理系統(tǒng)的基本功能實(shí)現(xiàn)代碼,大家可以查缺補(bǔ)漏,提升水平
    2022-05-05
  • Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問(wèn)題詳解

    Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問(wèn)題詳解

    這篇文章主要介紹了Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)

    Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)

    普通的隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),元素在隊(duì)列尾追加,而從隊(duì)列頭刪除。在優(yōu)先隊(duì)列中,元素被賦予優(yōu)先級(jí)。當(dāng)訪問(wèn)元素時(shí),具有最高優(yōu)先級(jí)的元素最先刪除。優(yōu)先隊(duì)列具有最高級(jí)先出 (first in, largest out)的行為特征。通常采用堆數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)
    2022-01-01
  • java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天

    java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天

    這篇文章主要介紹了java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • MyBatis-Plus的yml配置方式小結(jié)

    MyBatis-Plus的yml配置方式小結(jié)

    本文主要介紹了MyBatis-Plus的yml配置方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 解決程序包org.springframework.test.context不存在

    解決程序包org.springframework.test.context不存在

    這篇文章主要介紹了解決程序包org.springframework.test.context不存在的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論