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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JWT(2):JWT入门使用

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JWT(2):JWT入门使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 第一節 如何使用JWT
    • 1. 引入依賴
    • 2. 生成token
    • 3. 解析token
    • 4. 常見異常
    • 5. 封裝JWT方法
  • 第二節 JWT登錄和驗證
    • 1. 登錄
    • 2. 攔截器
    • 3. 獲取用戶信息

前言

JWT如何生成token?
token如何驗簽?
springboot中如何使用JWT?

如果你對JWT的概念不了解,建議先閱讀JWT的介紹,以方便對JWT的構成有清晰的認識,當然這并不影響你對JWT的使用。
詳細可以查看 JWT(1): JWT介紹
英文較好的可以查閱官方的介紹:https://jwt.io/introduction

第一節 如何使用JWT

1. 引入依賴

<!--引入jwt--><!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.0.0</version></dependency>

2. 生成token

@Testpublic void testJWTCreate(){String token=createToken();System.out.println(token);}public String createToken(){Calendar instance=Calendar.getInstance();instance.add(Calendar.SECOND,60);//默認包header加密是HS256,通常不需要設置 // JWT.create().withHeader()HashMap<String,Object> map=new HashMap<>();String token= JWT.create().withHeader(map).withClaim("userId",1) //指定用戶信息.withClaim("name","xiaowang") //指定用戶名.withExpiresAt(instance.getTime()) //指定過期時間.sign(Algorithm.HMAC256("%sabs*!3ja"));//簽名return token;}

運行結果

3. 解析token

@Testpublic void testVerification(){String token=createToken();JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("%sabs*!3ja")).build();DecodedJWT verify=jwtVerifier.verify(token);//解析jwtSystem.out.println(verify.getClaims());}

運行結果

4. 常見異常

  • SignatureVerificationException 簽名異常
  • TokenExpiredException Token失效異常
  • JWTDecodeException JWT解析異常
  • InvalidClaimException 有效負載無效異常
  • AlgorithmMismatchException 簽名算法不匹配

5. 封裝JWT方法

package com.it2.springbootjwt.util;import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Calendar; import java.util.Map;/*** JWT*/ public class JWTUtils {/*** 密鑰*/private static final String SECRET = "FTIq]>h!>2H-zd_";/*** 生成token** @param map* @param amount 有效期秒* @return*/public static String createToken(Map<String, String> map, Integer amount) {Calendar instance = Calendar.getInstance();/*** 簽名失效時間如果不傳遞,則默認7天*/amount = (null == amount || amount < 1) ? 7 * 24 * 60 * 60 : amount;instance.add(Calendar.SECOND, amount);//默認包header加密是HS256,通常不需要設置JWTCreator.Builder builder = JWT.create();map.forEach((k, v) -> {builder.withClaim(k, v);});String token = builder.withExpiresAt(instance.getTime()) //指定過期時間.sign(Algorithm.HMAC256(SECRET));//簽名return token;}/*** 驗簽** @param token*/public static void vertifyToken(String token) {getTokenInfo(token);}/*** 獲取token信息** @param token*/public static DecodedJWT getTokenInfo(String token) {JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();DecodedJWT verify = jwtVerifier.verify(token);//解析jwtreturn verify;} }

第二節 JWT登錄和驗證

1. 登錄

  • 首先,我們UserController實現登錄
  • package com.it2.springbootjwt.controller;import com.it2.springbootjwt.pojo.User; import com.it2.springbootjwt.service.UserService; import com.it2.springbootjwt.util.JWTUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController;import java.util.HashMap; import java.util.Map;@RestController @Slf4j public class UserController {@Autowiredprivate UserService userService;@PostMapping("/user/login")public Map<String, Object> login( String username,String password) {log.info("用戶名:{},密碼:{}", username, password);Map<String, Object> map = new HashMap<>();try {User user2 = userService.login(username,password);Map<String, String> payload = new HashMap<>();payload.put("userid", user2.getId() + "");payload.put("username", user2.getUsername());String token = JWTUtils.createToken(payload, null);map.put("token", token);map.put("code", "ok");map.put("msg", "登錄成功");} catch (Exception e) {map.put("code", "fail");map.put("msg", "登錄失敗");}return map;} } package com.it2.springbootjwt.pojo; import lombok.Data; @Data public class User {private Integer id;private String username;private String password; }
  • 實現service,這里只是demo,所以寫死service的實現,實際業務應當查詢數據庫進行驗證。
  • 啟動服務器,發起登錄測試,可以看到生成了token。
  • 2. 攔截器

    我們的業務在執行的時候,顯然需要編寫token是否有效,但是這明顯不可能放在各個業務中去鑒定。
    所以我們需要使用攔截器,攔截器可以在業務執行前判斷請求的token是否有效。

  • 定義攔截器
  • package com.it2.springbootjwt.interceptor;import com.alibaba.fastjson.JSONObject; 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.fasterxml.jackson.databind.util.JSONPObject; import com.it2.springbootjwt.util.JWTUtils; import lombok.extern.slf4j.Slf4j; 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;/*** JWT攔截器<br>*/ @Slf4j public class JWTInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Map<String, Object> map = new HashMap<>();String token = request.getHeader("token");try {JWTUtils.vertifyToken(token);return true;} catch (SignatureVerificationException e) {e.printStackTrace();map.put("msg", "簽名無效");} catch (TokenExpiredException e) {e.printStackTrace();map.put("msg", "token過期");} catch (AlgorithmMismatchException e) {e.printStackTrace();map.put("msg", "簽名算法不匹配");} catch (Exception e) {e.printStackTrace();map.put("msg", "token無效");}map.put("code", false);String jsonString = JSONObject.toJSONString(map);response.setContentType("application/json;charset=UTF-8");response.getWriter().println(jsonString);return false;} }
  • 添加攔截器
  • package com.it2.springbootjwt.config;import com.it2.springbootjwt.interceptor.JWTInterceptor; 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 {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new JWTInterceptor()).addPathPatterns("/*/*") //其它業務接口.excludePathPatterns("/user/login");//排除不攔截的接口} }
  • 編寫測試業務
  • package com.it2.springbootjwt.controller;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController @Slf4j public class HelloController {@GetMapping("/hello/sayHello")public String sayHello() {log.info("sayhello....");return "success";} }
  • 啟動服務器測試,業務發送請求時,將token添加到header中發送到服務端。這樣就能正常執行業務了。

    如果不傳遞token ,或者傳遞無效的token ,則無法通過攔截器,不能執行業務。
  • 3. 獲取用戶信息

    顯然我們在執行業務時,有時候需要獲取用戶的信息。那么我們可以通過header中獲取。

    @GetMapping("/hello/sayHello")public String sayHello(HttpServletRequest request) {String token= request.getHeader("token");DecodedJWT jwt=JWTUtils.getTokenInfo(token);System.out.println( jwt.getClaim("username").asString());System.out.println( jwt.getClaim("userid").asString());log.info("sayhello....");return "success";}

    運行結果

    總結

    以上是生活随笔為你收集整理的JWT(2):JWT入门使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 与亲女洗澡时伦了毛片 | 91久久国产综合久久 | 亚洲成人网在线 | 99在线视频精品 | 亚洲精品成人无码毛片 | 国产欧美日韩二区 | 中文字幕一区二区三区精华液 | 国产a√精品区二区三区四区 | 精品视频在线播放 | 在线亚洲观看 | 欧洲精品一区二区三区久久 | 日日躁狠狠躁 | 亚洲欧美日韩精品久久亚洲区 | 特一级黄色 | 三级黄色网络 | 韩国黄色一级片 | 亚洲AV无码成人片在线观看 | 九色福利| 美女扒开尿口给男人捅 | 精品国产一区二区三区久久久久久 | 国产免费三片 | 人妖一级片 | 国产一区二区三区免费 | 精品人妻少妇一区二区 | 欧美 亚洲 激情 一区 | 日噜噜夜噜噜 | 玩偶姐姐在线观看免费 | 香蕉网在线播放 | 中文字幕亚洲精品在线观看 | 亚洲精品短视频 | 国产一区二区三区高清 | 亚洲日本中文字幕在线 | 日本一区二区三区在线视频 | 久久久久a | 国产区在线看 | 中文字幕av在线免费 | 国产在线一二三 | 日韩国产高清在线 | 一级欧美一级日韩 | 黄页网站在线看 | 国产高清在线一区 | 亚洲激情五月婷婷 | 亚洲AV无码成人国产精品色 | 激情综合网五月天 | 国产一区导航 | 成人av免费网站 | 亚洲欧美日韩动漫 | 精品一区二区亚洲 | 色干干 | 啊v视频在线 | 国产对白羞辱绿帽vk | av老司机在线观看 | 黄色一级片在线看 | 久99视频| 亚洲影院在线播放 | 一区二区成人在线观看 | 熟妇毛片| 欧美黑人一区二区 | 五月伊人婷婷 | 欧州一区二区三区 | 三级黄色免费片 | 亚洲综合免费 | 天天操天天干天天爱 | 欧美嫩草| 白丝动漫美女 | 伊人资源 | 色资源网站 | 羞羞影院体验区 | 女女h百合无遮涩涩漫画软件 | 日韩欧美综合久久 | 偷拍亚洲另类 | 久久精品国产亚洲AV黑人 | 黄色av电影在线观看 | 欧美人妻精品一区二区免费看 | 3d动漫精品啪啪一区二区三区免费 | 中文字幕一区二区在线观看 | 男人的天堂一级片 | 欧美老女人性生活 | 美女裸体跪姿扒开屁股无内裤 | 日韩av网址在线观看 | 永久免费不卡在线观看黄网站 | 黄色麻豆视频 | 高清一级片 | 欧美精品一级二级 | 日韩中字在线 | 靠逼动漫| 欧美z○zo重口另类黄 | 麻豆tube| 欧美高清视频在线观看 | 三级欧美韩日大片在线看 | 亚洲小说区图片区都市 | 日本www在线播放 | 国产做爰xxxⅹ久久久精华液 | 欧美精品第一区 | 久久精品三级视频 | 中文有码av | 一级片久久久 | 免费99精品国产自在在线 | 天天摸夜夜爽 |