Java實現(xiàn)Token工具類進行登錄和攔截
在應(yīng)用的登錄時需要生成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,到服務(wù)器解析生成對應(yīng)的登錄者數(shù)據(jù),可以查詢數(shù)據(jù)庫并執(zhí)行將數(shù)據(jù)放到Redis的一些操作,后端可以使用網(wǎng)關(guān)的過濾以及攔截去實現(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找到對應(yīng)的人物
比如toKen免密登錄解析出為user:001根據(jù)拿到的數(shù)據(jù)去數(shù)據(jù)庫查詢?nèi)宋镄畔ⅲ诺絉edis中
(權(quán)限驗證:輕松實現(xiàn)權(quá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ā)送錯誤響應(yīng) response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } // 3.3 權(quán)限驗證,根據(jù)需要執(zhí)行 } catch (Exception e) { // 令牌無效或解碼失敗,發(fā)送錯誤響應(yīng) response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } // 驗證通過,返回true,請求繼續(xù)到達控制器方法 return true; } }
這樣就可以了
到此這篇關(guān)于Java實現(xiàn)Token工具類進行登錄和攔截的文章就介紹到這了,更多相關(guān)Java Token登錄和攔截內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java動態(tài)循環(huán)隊列是如何實現(xiàn)的
今天帶大家學(xué)習(xí)java隊列的相關(guān)知識,文章圍繞著如何實現(xiàn)Java動態(tài)循環(huán)隊列展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06MyBatis傳入數(shù)組集合類并使用foreach遍歷
這篇文章主要介紹了MyBatis傳入數(shù)組集合類并使用foreach遍歷,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02SpringBoot3使用Jasypt加密數(shù)據(jù)庫用戶名、密碼等敏感信息
使用Jasypt(Java Simplified Encryption)進行數(shù)據(jù)加密和解密主要涉及幾個步驟,包括引入依賴、配置加密密碼、加密敏感信息、將加密信息存儲到配置文件中,以下是詳細的使用說明,需要的朋友可以參考下2024-07-07mybatis主從表關(guān)聯(lián)查詢,返回對象帶有集合屬性解析
這篇文章主要介紹了mybatis主從表關(guān)聯(lián)查詢,返回對象帶有集合屬性解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Spring Boot結(jié)合ECharts案例演示示例
本文主要主要介紹了Spring Boot結(jié)合ECharts案例演示示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06SpringBoot繼承LogStash實現(xiàn)日志收集的方法示例
這篇文章主要介紹了SpringBoot繼承LogStash實現(xiàn)日志收集的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05