JAVA 实现 JWT
生活随笔
收集整理的這篇文章主要介紹了
JAVA 实现 JWT
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 用來跳過驗證的PassToken
- 需要登錄才能進行操作的注解UserLoginToken
@Target:注解的作用目標
- @Target(ElementType.TYPE)——接口、類、枚舉、注解
- @Target(ElementType.FIELD)——字段、枚舉的常量
- @Target(ElementType.METHOD)——方法
- @Target(ElementType.PARAMETER)——方法參數
- @Target(ElementType.CONSTRUCTOR) ——構造函數
- @Target(ElementType.LOCAL_VARIABLE)——局部變量
- @Target(ElementType.ANNOTATION_TYPE)——注解
- @Target(ElementType.PACKAGE)——包
@Retention:注解的保留位置
RetentionPolicy.SOURCE:這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略,在class字節碼文件中不包含。 RetentionPolicy.CLASS:這種類型的Annotations編譯時被保留,默認的保留策略,在class文件中存在,但JVM將會忽略,運行時無法獲得。 RetentionPolicy.RUNTIME:這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其他使用反射機制的代碼所讀取和使用。
@Document:說明該注解將被包含在javadoc中
@Inherited:說明子類可以繼承父類中的該注解
3.編寫token的生成方法
- 生成不攜帶自定義信息的 JWT token
Algorithm.HMAC256(): 使 HS256 生token,唯一密鑰可以保存在服務端。“secret” 為相應的密鑰
- 生成攜帶自定義信息的 JWT token
自定義信息通過 withClaim 方法進行添加,具體操作如下:
- 構建密鑰信息
- 通過密鑰信息和簽名的發布者的信息生成 JWTVerifier (JWT驗證類)
不添加 .withIssuer(“SERVICE”) 也是可以獲取 JWTVerifier 。
- 通過 JWTVerifier 的verify獲取 token中的信息。
如下面代碼所示就可以獲取到我們之前生成 token 的 簽名的主題,觀眾 和自定義的聲明信息。
String subject = jwt.getSubject();//獲得簽名主題List<String> audience = jwt.getAudience();//獲得簽名接收方Map<String, Claim> claims = jwt.getClaims();//獲得自定義信息for (Entry<String, Claim> entry : claims.entrySet()) {String key = entry.getKey();Claim claim = entry.getValue();System.out.println("key:"+key+" value:"+claim.asString());}實現一個攔截器就需要實現HandlerInterceptor接口
HandlerInterceptor接口主要定義了三個方法
- boolean preHandle (): 預處理回調方法,實現處理器的預處理,第三個參數為響應的處理器,自定義Controller,返回值為true表示繼續流程(如調用下一個攔截器或處理器)或者接著執行 postHandle()和afterCompletion();false表示流程中斷,不會繼續調用其他的攔截器或處理器,中斷執行。
- void postHandle(): 后處理回調方法,實現處理器的后處理(DispatcherServlet進行視圖返回渲染之前進行調用),此時我們可以通過modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能為null。
- void afterCompletion(): 整個請求處理完畢回調方法,該方法也是需要當前對應的Interceptor的preHandle()的返回值為true時才會執行,也就是在DispatcherServlet渲染了對應的視圖之后執行。用于進行資源清理。整個請求處理完畢回調方法。如性能監控中我們可以在此記錄結束時間并輸出消耗時間,還可以進行一些資源清理,類似于try-catch-finally中的finally,但僅調用處理器執行鏈中
主要流程:
1.從 http 請求頭中取出 token
2.判斷是否映射到方法或控制器類
3.檢查是否有passtoken注釋,有則跳過認證
4.檢查有沒有需要用戶登錄的注解,有則需要取出并驗證
5.認證通過則可以訪問,不通過會報相關錯誤信息
6.注冊攔截器
在配置類上添加了注解@Configuration,標明了該類是一個配置類并且會將該類作為一個SpringBean添加到IOC容器內
@Configuration public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**"); // 攔截所有請求,通過判斷是否有 @UserLoginToken 注解 決定是否需要登錄}@Beanpublic AuthenticationInterceptor authenticationInterceptor() {return new AuthenticationInterceptor();} }總結
JWT 就是一個生成 Token 的工具,如果不使用 JWT 我們也可以根據自己加密規則生成 Token。只不過 JWT 規范了生成 Token 定義了一個標準而已。JWT 的核心的功能就是:生成Token、解析Token。
參考博客:
- https://blog.csdn.net/ljk126wy/article/details/82751787
- https://www.jianshu.com/p/e88d3f8151db
總結
以上是生活随笔為你收集整理的JAVA 实现 JWT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么申请域名绿标(怎么申请域名绿标注册)
- 下一篇: 单词拆分