Springboot中JWT登錄校驗(yàn)及其攔截器實(shí)現(xiàn)方法
前言
這篇我們主要實(shí)現(xiàn)后端對(duì)用戶登錄的身份校驗(yàn),是web項(xiàng)目核心功能之一。
后續(xù)會(huì)有springboot整合各個(gè)功能的文章,同時(shí)也會(huì)有前端的相關(guān)知識(shí),希望能給web開發(fā)學(xué)習(xí)者提供幫助~
一、JWT是什么?
JWT(JSON Web Token)是一種基于 JSON 的輕量級(jí)開放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用間安全地傳遞聲明信息。它通過(guò)數(shù)字簽名確保信息的完整性和真實(shí)性,常被用于身份驗(yàn)證和數(shù)據(jù)交換場(chǎng)景。
二、實(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
封裝一個(gè)靜態(tài)函數(shù)用來(lái)生成token。在service層用戶登錄信息匹配成功后,可以調(diào)用該函數(shù),來(lái)獲取Token,同時(shí)把Token密鑰返回給前端。
public static String getToken(String userId, String password){
long EXPIRE_TIME = 60 * 60 * 1000; //過(guò)期時(shí)間 60 分鐘
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
String token = JWT.create().withAudience(userId) // 將 userId 保存到 token 里面
.withExpiresAt(date) //60分鐘后token過(guò)期
.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) {
//通過(guò)預(yù)檢請(qǐng)求
if(request.getMethod().equals("OPTION")){
return true;
}
//從請(qǐng)求頭中獲取Token,xxx為前端請(qǐng)求頭中value為Token密鑰的key
String token = request.getHeader("xxx");
// 如果不是映射到方法直接通過(guò)
if(!(handler instanceof HandlerMethod)){
return true;
}
//ServiceException是自定義的異常
if(token == null){
throw new ServiceException(Constants.CODE_401,"請(qǐng)登錄");
}
String userId;
try {
//對(duì)Token密鑰進(jìn)行解密,獲取用戶id
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
//Token密鑰有誤,無(wú)法解密
throw new ServiceException(Constants.CODE_401,"請(qǐng)登錄");
}
//通過(guò)解密后獲取的用戶id進(jìn)行數(shù)據(jù)庫(kù)查詢,判斷是否有該id的用戶
User user = userService.getUser(userId);
if (user == null) {
//沒有該用戶
throw new ServiceException(Constants.CODE_401,"請(qǐng)登錄");
}
//獲取從數(shù)據(jù)庫(kù)查詢出來(lái)的用戶密碼,對(duì)前端帶過(guò)來(lái)的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,"請(qǐng)登錄");
}
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)了后端對(duì)用戶登錄的身份校驗(yàn),希望對(duì)未來(lái)的高級(jí)工程師們起到幫助,謝謝啦~
到此這篇關(guān)于Springboot中JWT登錄校驗(yàn)及其攔截器實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Springboot JWT登錄校驗(yàn)及攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Jasypt如何對(duì)Spring Boot配置文件加密
這篇文章主要給大家介紹了關(guān)于利用Jasypt如何對(duì)Spring Boot配置文件加密的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
MybatisPlus中@TableLogic注解的使用實(shí)現(xiàn)
@TableLogic注解是MyBatis-Plus框架中用于處理邏輯刪除的注解,邏輯刪除是一種常見的刪除策略,其中并不真正刪除數(shù)據(jù)記錄,而是通過(guò)修改某個(gè)標(biāo)記字段的值來(lái)表示記錄已經(jīng)被刪除,方便以后恢復(fù)或者審計(jì),感興趣的可以了解一下2025-10-10
Spring?Boot?Swagger3常用注解詳解與實(shí)戰(zhàn)指南
Swagger是一個(gè)用于設(shè)計(jì)、構(gòu)建、文檔化和使用RESTful?Web服務(wù)的開源工具,Swagger3是Swagger的最新版本,它提供了許多新功能和改進(jìn),這篇文章主要介紹了Spring?Boot?Swagger3常用注解詳解與實(shí)戰(zhàn)指南的相關(guān)資料,需要的朋友可以參考下2025-10-10
Spring的@Transactional注解使用詳細(xì)解析
這篇文章主要介紹了Spring的@Transactional注解使用詳細(xì)解析,@Transactional 注解相信大家并不陌生,平時(shí)開發(fā)中很常用的一個(gè)注解,它能保證方法內(nèi)多個(gè)數(shù)據(jù)庫(kù)操作要么同時(shí)成功、要么同時(shí)失敗,需要的朋友可以參考下2023-11-11
Java中使用異或語(yǔ)句實(shí)現(xiàn)兩個(gè)變量的互換
這篇文章主要介紹了Java中使用異或語(yǔ)句實(shí)現(xiàn)兩個(gè)變量的互換,本文直接給出代碼實(shí)例以及運(yùn)行結(jié)果,需要的朋友可以參考下2015-06-06
JavaWeb開發(fā)之使用jQuery與Ajax實(shí)現(xiàn)動(dòng)態(tài)聯(lián)級(jí)菜單效果
這篇文章主要介紹了JavaWeb開發(fā)之使用jQuery與Ajax實(shí)現(xiàn)動(dòng)態(tài)聯(lián)級(jí)菜單效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn)解析
這篇文章主要介紹了Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn),IOC是Spring的核心思想之一,它通過(guò)將對(duì)象的創(chuàng)建、依賴注入和生命周期管理交給容器來(lái)實(shí)現(xiàn)解耦,使開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),需要的朋友可以參考下2025-02-02
spring boot 本地圖片不能加載(圖片路徑)的問題及解決方法
這篇文章主要介紹了spring boot 本地圖片不能加載(圖片路徑)的問題,解決的辦法其實(shí)很簡(jiǎn)單,只要寫一個(gè)配置文件,也就是圖片位置的轉(zhuǎn)化器,原理是虛擬一個(gè)在服務(wù)器上的文件夾,與本地圖片的位置進(jìn)行匹配。需要的朋友可以參考下2018-04-04

