Springboot中JWT登錄校驗(yàn)及其攔截器實(shí)現(xiàn)方法
前言
這篇我們主要實(shí)現(xiàn)后端對用戶登錄的身份校驗(yàn),是web項(xiàng)目核心功能之一。
后續(xù)會有springboot整合各個功能的文章,同時也會有前端的相關(guān)知識,希望能給web開發(fā)學(xué)習(xí)者提供幫助~
一、JWT是什么?
JWT(JSON Web Token)是一種基于 JSON 的輕量級開放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用間安全地傳遞聲明信息。它通過數(shù)字簽名確保信息的完整性和真實(shí)性,常被用于身份驗(yàn)證和數(shù)據(jù)交換場景。
二、實(shí)現(xiàn)步驟
1.引入Maven坐標(biāo)
在pom.xml中引入Maven坐標(biāo):
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>2.獲取Token
封裝一個靜態(tài)函數(shù)用來生成token。在service層用戶登錄信息匹配成功后,可以調(diào)用該函數(shù),來獲取Token,同時把Token密鑰返回給前端。
public static String getToken(String userId, String password){
long EXPIRE_TIME = 60 * 60 * 1000; //過期時間 60 分鐘
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
String token = JWT.create().withAudience(userId) // 將 userId 保存到 token 里面
.withExpiresAt(date) //60分鐘后token過期
.sign(Algorithm.HMAC256(password)); //使用用戶id和password進(jìn)行token生成
return token; //返回加密后的token密鑰
}3.JWT攔截器的實(shí)現(xiàn)
public class JwtInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//通過預(yù)檢請求
if(request.getMethod().equals("OPTION")){
return true;
}
//從請求頭中獲取Token,xxx為前端請求頭中value為Token密鑰的key
String token = request.getHeader("xxx");
// 如果不是映射到方法直接通過
if(!(handler instanceof HandlerMethod)){
return true;
}
//ServiceException是自定義的異常
if(token == null){
throw new ServiceException(Constants.CODE_401,"請登錄");
}
String userId;
try {
//對Token密鑰進(jìn)行解密,獲取用戶id
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
//Token密鑰有誤,無法解密
throw new ServiceException(Constants.CODE_401,"請登錄");
}
//通過解密后獲取的用戶id進(jìn)行數(shù)據(jù)庫查詢,判斷是否有該id的用戶
User user = userService.getUser(userId);
if (user == null) {
//沒有該用戶
throw new ServiceException(Constants.CODE_401,"請登錄");
}
//獲取從數(shù)據(jù)庫查詢出來的用戶密碼,對前端帶過來的Token密鑰進(jìn)行進(jìn)一步驗(yàn)證
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try {
jwtVerifier.verify(token);
} catch (JWTVerificationException e) {
//Token密鑰有誤
throw new ServiceException(Constants.CODE_401,"請登錄");
}
return true;
}
}
4.JWT攔截器配置
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//"/user/login","/xxx","/yyy/**" 為JWT攔截器不攔截,直接放行的接口
registry.addInterceptor(jwtInterceptor())
.addPathPatterns("/**").excludePathPatterns("/user/login","/xxx","/yyy/**");
}
@Bean
public JwtInterceptor jwtInterceptor(){
return new JwtInterceptor();
}
}
總結(jié)
以上實(shí)現(xiàn)了后端對用戶登錄的身份校驗(yàn),希望對未來的高級工程師們起到幫助,謝謝啦~
到此這篇關(guān)于Springboot中JWT登錄校驗(yàn)及其攔截器實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Springboot JWT登錄校驗(yàn)及攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java如何判斷ResultSet結(jié)果集是否為空
ResultSet 表示 select 語句的查詢結(jié)果集。這篇文章主要為大家詳細(xì)介紹了Java如何判斷ResultSet結(jié)果集是否為空,感興趣的可以了解一下2023-02-02
SpringBoot 內(nèi)嵌 camunda的配置方法
Camunda是一個基于Java的框架,支持用于工作流和流程自動化的BPMN、用于案例管理的CMMN和用于業(yè)務(wù)決策管理的DMN,這篇文章主要介紹了SpringBoot 內(nèi)嵌 camunda,需要的朋友可以參考下2024-06-06
SpringBoot框架內(nèi)使用Java調(diào)用訊飛星火api完整步驟
近年來人工智能技術(shù)已經(jīng)成為了各行各業(yè)中不可或缺的一部分,訊飛星火認(rèn)知是訊飛科技推出的AI開放平臺,為開發(fā)者提供了豐富的人工智能技術(shù)接口和服務(wù),這篇文章主要介紹了SpringBoot框架內(nèi)使用Java調(diào)用訊飛星火api的相關(guān)資料,需要的朋友可以參考下2025-05-05
Java EE過濾器優(yōu)先級控制的實(shí)例解讀
通過使用@Priority注解,可以控制JavaEE應(yīng)用中過濾器的執(zhí)行順序,在上面的示例中,我們通過設(shè)置不同的優(yōu)先級,實(shí)現(xiàn)了TimeFilter和LogFilter的執(zhí)行順序控制2025-02-02
Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解
這篇文章主要介紹了Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

