Java實現(xiàn)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é)
這篇文章主要給大家總結(jié)介紹了關于java中List去除重復數(shù)據(jù)的5種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
淺析java中String類型中“==”與“equal”的區(qū)別
這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
datax-web在windows環(huán)境idea中模塊化打包部署操作步驟
這篇文章主要介紹了datax-web在windows環(huán)境idea中模塊化打包部署操作步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05
Lombok之@AllArgsConstructor的使用方式
這篇文章主要介紹了Lombok之@AllArgsConstructor的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

