Java登錄功能實現(xiàn)token生成與驗證
更新時間:2021年12月01日 16:51:03 作者:穆晟銘
這篇文章介紹了Java登錄功能實現(xiàn)token生成與驗證,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
一、token與cookie相比較的優(yōu)勢
- 1、支持跨域訪問,將token置于請求頭中,而cookie是不支持跨域訪問的;
- 2、無狀態(tài)化,服務端無需存儲token,只需要驗證token信息是否正確即可,而session需要在服務端存儲,一般是通過cookie中的sessionID在服務端查找對應的session;
- 3、無需綁定到一個特殊的身份驗證方案(傳統(tǒng)的用戶名密碼登陸),只需要生成的token是符合我們預期設定的即可;
- 4、更適用于移動端(Android,iOS,小程序等等),像這種原生平臺不支持cookie,比如說微信小程序,每一次請求都是一次會話,當然我們可以每次去手動為他添加cookie,詳情請查看博主另一篇博客;
- 5、避免CSRF跨站偽造攻擊,還是因為不依賴cookie;
二、基于JWT的token認證實現(xiàn)
JWT:JSON Web Token,其實token就是一段字符串,由三部分組成:Header,Payload,Signature
1、引入依賴
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.2</version>
</dependency>
2、設置密鑰和生存時間
//設置過期時間 private static final long EXPIRE_DATE=30*60*100000; //token秘鑰 private static final String TOKEN_SECRET = "ZCEQIUBFKSJBFJH2020BQWE";
3、實現(xiàn)簽名方法
public static String token (String username,String password){
String token = "";
try {
//過期時間
Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
//秘鑰及加密算法
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
//設置頭部信息
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、驗證token
public static boolean verify(String token){
/**
* @desc 驗證token,通過返回true
* @create 2019/1/18/018 9:39
* @params [token]需要校驗的串
**/
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、測試
直接用生成的token去驗證,成功
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驗證用戶是否登錄
* @author zm
**/
public class TokenUtils {
//設置過期時間
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 {
//過期時間
Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
//秘鑰及加密算法
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
//設置頭部信息
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 驗證token,通過返回true
* @params [token]需要校驗的串
**/
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);
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
基于SpringBoot實現(xiàn)輕量級的動態(tài)定時任務調度的方法
本文介紹了如何在SpringBoot框架中實現(xiàn)輕量級的動態(tài)定時任務調度,通過將任務以類為基礎單位,并通過配置數(shù)據(jù)進行任務讀取和反射生成任務對象,感興趣的朋友跟隨小編一起看看吧2024-11-11
SpringCloud Finchley Gateway 緩存請求Body和Form表單的實現(xiàn)
在接入Spring-Cloud-Gateway時,可能有需求進行緩存Json-Body數(shù)據(jù)或者Form-Urlencoded數(shù)據(jù)的情況。這篇文章主要介紹了SpringCloud Finchley Gateway 緩存請求Body和Form表單的實現(xiàn),感興趣的小伙伴們可以參考一下2019-01-01
如何使用Spring AOP的通知類型及創(chuàng)建通知
這篇文章主要給大家介紹了關于如何使用Spring AOP的通知類型及創(chuàng)建通知的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring AOP具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-12-12

