SpringBoot集成JWT的工具類與攔截器實(shí)現(xiàn)方式
導(dǎo)入依賴
<!--引入JWT-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>配置文件
# token配置
token:
jwt:
# 令牌自定義標(biāo)識(shí)
header: Authorization
# 令牌密鑰
secret: ">?N<:{LWPWXX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545fdf"
# 令牌有效期,單位分鐘(默認(rèn)30分鐘)
expireTime: 30Jwt工具類
包括token的生成,token的驗(yàn)證并返回存在負(fù)載中的用戶信息
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.auth0.jwt.JWTCreator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
/**
* 登錄Token的生成和解析
*/
@Component
public class JwtUtils {
/**
* token秘鑰
*/
public static String SECRET = "";
/**
* token 過(guò)期時(shí)間單位
*/
public static final int calendarField = Calendar.MINUTE;
/**
* token 過(guò)期時(shí)間
*/
public static int calendarInterval = 30;
@Value("${token.jwt.secret}")
public void setSECRET(String SECRET) {
JwtUtils.SECRET = SECRET;
}
@Value("${token.jwt.expireTime}")
public void setCalendarInterval(int calendarInterval) {
JwtUtils.calendarInterval = calendarInterval;
}
/**
* JWT生成Token.<br/>
* <p>
* JWT構(gòu)成: header, payload, signature
*
* @param map 登錄成功后用戶信息
*/
public static String createToken(Map<String,String> map) {
Date iatDate = new Date();
// expire time
Calendar nowTime = Calendar.getInstance();
nowTime.add(calendarField, calendarInterval);
Date expiresDate = nowTime.getTime();
// header Map
Map<String, Object> header = new HashMap<>();
header.put("alg", "HS256");
header.put("typ", "JWT");
// 創(chuàng)建 token
// param backups {iss:Service, aud:APP}
JWTCreator.Builder builder = JWT.create().withHeader(header); // header
map.forEach(builder::withClaim); // payload
// 指定token過(guò)期簽名 和 簽名
return builder.withExpiresAt(expiresDate).sign(Algorithm.HMAC256(SECRET));
}
/**
* 解密token
* @param token 傳入的token
* @return 解密后的結(jié)果
*/
public static Map<String, Claim> verifyToken(String token) {
DecodedJWT jwt = null;
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
jwt = verifier.verify(token);
} catch (Exception e) {
// token 校驗(yàn)失敗, 拋出Token驗(yàn)證非法異常
e.printStackTrace();
}
assert jwt != null;
return jwt.getClaims();
}
}定義攔截器
對(duì)需要token驗(yàn)證的接口進(jìn)行攔截
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lixianhe.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
@Component
public class JWTInterceptor implements HandlerInterceptor {
@Value("${token.jwt.heade}r")
private String header;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Map<String, Object> map = new HashMap<>();
// 獲取請(qǐng)求頭中的token
String token = request.getHeader(header);
if(token ==null){
response.setStatus(401);
return false;
}
try {
// 驗(yàn)證token,返回token中的信息
JwtUtils.verifyToken(token);
return true;
}catch (SignatureVerificationException e){
map.put("msg","無(wú)效簽名");
} catch (TokenExpiredException e){
map.put("msg","token過(guò)期");
}catch (AlgorithmMismatchException e){
map.put("msg","簽名算法不一致");
}catch (Exception e){
map.put("msg","token無(wú)效");
}
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().println(json);
return false;
}
}配置攔截器
配置對(duì)哪些路徑攔截,哪些路徑放行
import com.lixianhe.intercept.JWTInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private JWTInterceptor jwtInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/index") // 攔截
.excludePathPatterns("/hello"); // 不攔截
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring MVC 擴(kuò)展和 SSM 框架整合步驟詳解
在前端頁(yè)面后后臺(tái)交互的過(guò)程中,需要一種格式清晰、高效且兩端都可以輕松使用的數(shù)據(jù)格式做交互的媒介,JSON正可以滿足這一需求,下面學(xué)習(xí)使用Spring MVC 框架處理JSON數(shù)據(jù),感興趣的朋友一起看看吧2024-08-08
數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作
這篇文章主要介紹了數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot MDC全鏈路調(diào)用日志跟蹤實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了SpringBoot MDC全鏈路調(diào)用日志跟蹤實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Spring Boot創(chuàng)建可執(zhí)行jar包的實(shí)例教程
這篇文章主要介紹了Spring Boot創(chuàng)建可執(zhí)行jar包的實(shí)例教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Java中用戶向系統(tǒng)傳遞參數(shù)的三種基本方式實(shí)例分享
這篇文章主要介紹了Java中用戶向系統(tǒng)傳遞參數(shù)的三種基本方式實(shí)例,有需要的朋友可以參考一下2014-01-01
Maven?pom.xml文件獲取當(dāng)前時(shí)間戳方式
這篇文章主要介紹了Maven?pom.xml文件獲取當(dāng)前時(shí)間戳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot項(xiàng)目開發(fā)中常用的依賴
這篇文章主要介紹了SpringBoot項(xiàng)目開發(fā)中常用的依賴詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
nacos服務(wù)注冊(cè)服務(wù)發(fā)現(xiàn)依賴配置詳解
這篇文章主要為大家介紹了nacos服務(wù)注冊(cè)服務(wù)發(fā)現(xiàn)依賴配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
java解決動(dòng)態(tài)配置字段需求問(wèn)題
這篇文章主要介紹了java解決動(dòng)態(tài)配置字段需求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

