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