日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析

發布時間:2024/9/20 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GitHub源碼地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git

封裝JTW生成token和校驗方法

public class JwtTokenUtil {

//公用密鑰-保存在服務端,客戶端是不會知道密鑰的,以防被攻擊

public static String SECRET = "ThisIsASecret";

//生成Troke

public static String createToken(String username) {

//簽發時間

//Date iatDate = new Date();

//過地時間 1分鐘后過期

//Calendar nowTime = Calendar.getInstance();

//nowTime.add(Calendar.MINUTE, 1);

//Date expiresDate = nowTime.getTime();

Map map = new HashMap();

map.put("alg", "HS256");

map.put("typ", "JWT");

String token = JWT.create()

.withHeader(map)

//.withClaim( "name","Free碼生") //設置 載荷 Payload

//.withClaim("age","12")

//.withClaim( "org","測試")

//.withExpiresAt(expiresDate)//設置過期時間,過期時間要大于簽發時間

//.withIssuedAt(iatDate)//設置簽發時間

.withAudience(username) //設置 載荷 簽名的觀眾

.sign(Algorithm.HMAC256(SECRET));//加密

System.out.println("后臺生成token:" + token);

return token;

}

//校驗TOKEN

public static boolean verifyToken(String token) throws UnsupportedEncodingException{

JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

try {

verifier.verify(token);

return true;

} catch (Exception e){

return false;

}

}

//獲取Token信息

public static DecodedJWT getTokenInfo(String token) throws UnsupportedEncodingException{

JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

try{

return verifier.verify(token);

} catch(Exception e){

throw new RuntimeException(e);

}

}

}

新建自定義注解:@UserLoginToken

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface UserLoginToken {

boolean required() default true;

}

關于攔截器配置:

@Configuration

public class InterceptorConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(authenticationInterceptor())

.addPathPatterns("/**"); // 攔截所有請求,通過判斷是否有 @LoginRequired 注解 決定是否需要登錄

}

@Bean

public AuthenticationInterceptor authenticationInterceptor() {

return new AuthenticationInterceptor();

}

}

public class AuthenticationInterceptor implements HandlerInterceptor {

@Autowired

UserService userService;

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {

String token = httpServletRequest.getHeader("token");// 從 http 請求頭中取出 token

// 如果不是映射到方法直接通過

if(!(object instanceof HandlerMethod)){

return true;

}

HandlerMethod handlerMethod=(HandlerMethod)object;

Method method=handlerMethod.getMethod();

//檢查是否有passtoken注釋,有則跳過認證

if (method.isAnnotationPresent(PassToken.class)) {

PassToken passToken = method.getAnnotation(PassToken.class);

if (passToken.required()) {

return true;

}

}

//檢查有沒有需要用戶權限的注解

if (method.isAnnotationPresent(UserLoginToken.class)) {

UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);

if (userLoginToken.required()) {

// 執行認證

if (token == null) {

throw new RuntimeException("無token,請重新登錄");

}

// 驗證 token

if(JwtTokenUtil.verifyToken(token)){

return true;

}else {

throw new RuntimeException("401");

}

}

}

return true;

}

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}

}

登錄:

在Controller上登錄方法不用添加@UserLoginToken自定義注解,其余獲取后臺數據方法加上@UserLoginToken自定義注解,目的驗證token是否有效,是則返回數據,否則提示401無權限。

測試:

@Controller

@RequestMapping(path = "/api")

public class IndexController {

private String prefix = "index/";

@GetMapping("/index")

public String index()

{

return prefix + "index";

}

@UserLoginToken

@PostMapping("/test")

@ResponseBody

public Object test(){

Map map = new HashMap<>();

map.put("code","200");

map.put("message","你已通過驗證了");

return map;

}

}

HTTP請求帶上登陸成功后生成token,返回成功:

HTTP請求帶上無效token或不帶token,返回失敗:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av噜噜色 | 美女被草出水 | 日韩成人免费在线观看 | mm视频在线观看 | 草草久久久无码国产专区 | 三及毛片 | 给我看免费高清在线观看 | 国产精品国产三级国产三级人妇 | 性高潮视频在线观看 | 精品视频在线观看一区二区 | 东京av男人的天堂 | 欧美做爰全过程免费看 | 国产中文字幕亚洲 | 在线观看污网站 | 999www | 国产成人在线观看网站 | 精品国产亚洲av麻豆 | 天天综合天天色 | 精品久久久亚洲 | 亚洲综合五月 | 在线a毛片| 成年人福利视频 | 日韩区在线观看 | 好吊妞在线观看 | 福利在线一区二区三区 | 91视频爱爱 | www.夜夜爽 | 久草综合网 | 情欲少妇人妻100篇 黄色一级片欧美 | 91桃色污 | 欧美三级韩国三级日本三斤在线观看 | 久久爱影视 | 国产av人人夜夜澡人人爽麻豆 | 日产av在线 | 亚洲综合激情网 | 亚洲高清在线免费观看 | 草草影院国产第一页 | 欧美xxxx83d | 一级片毛片 | 成人精品视频在线观看 | 国产探花一区 | 日日草 | 成人片在线免费看 | 妖精视频在线观看免费 | 欧美影院在线 | 91精品啪在线观看国产线免费 | 欧美tickle狂笑裸体vk | 亚洲av片不卡无码久久 | 精品视频亚洲 | 亚洲色图欧美视频 | 亚洲AV永久无码国产精品国产 | 国产av无码专区亚洲av毛片搜 | 性户外野战hd | 久久狠狠高潮亚洲精品 | 欧美裸体xxx | 中国在线观看免费视频 | 欧美日韩网址 | 在线激情av | 国产精品 日韩 | 中文字幕日韩一区二区 | 男女乱淫| 人物动物互动39集免费观看 | 一区二区三区激情 | av无码一区二区三区 | 极品美女扒开粉嫩小泬 | 欧美二区在线观看 | 欧美高清一区 | 成人h动漫在线 | 国产激情综合五月久久 | 中文字幕无码毛片免费看 | 在线免费黄色网址 | 亚洲男人天堂网址 | 69精品国产| 日韩av网页| 91精品国产乱码在线观看 | 国产午夜无码视频在线观看 | 在线色播 | 摸大乳喷奶水www视频 | 美女调教视频 | 日本免费无人高清 | 亚洲国产二区 | 在线观看av黄色 | 无码精品一区二区三区在线 | 国产三级精品三级在线 | 欧美aa级| 国产一区二区自拍视频 | 欧美美女在线观看 | 污视频网站免费在线观看 | av黄色在线播放 | n0659极腔濑亚美莉在线播放播放 | 天天综合久久综合 | 天天操夜夜欢 | 久久亚洲网站 | 欧美一区二区三区视频在线 | 久久免费福利视频 | 无码国产精品一区二区高潮 | 野外吮她的花蒂高h在线观看 | 国产成人av一区二区三区 | 亚洲精品一区二区三区在线观看 |