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

歡迎訪問 生活随笔!

生活随笔

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

javascript

Springboot:JWT

發布時間:2023/12/16 javascript 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboot:JWT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Springboot:JWT
  • 一、JWT簡介
    • 1、JWT的優勢
    • 2、JWT的結構
      • 2.1、標頭(Header)
      • 2.2、有效負荷(Payload)
      • 2.3、簽名(Signature)
  • 二、SpringBoot整合JWT

Springboot:JWT

一、JWT簡介

JWT,是指JSON Web Token,也就指通過JSON形式作為Web應用中的令牌,用于在各方之間安全地將信息作為JSON對象傳輸。在數據傳輸過程中還可以完成數據加密、簽名等相關處理。


1、JWT的優勢

在JavaWeb階段,經常使用session來存儲,以方便用來判斷用戶是否操作等等

但是這里暴露了一個問題,用session存儲需要占用服務器內存,當用戶只有一兩個的時候沒啥問題,但是當用戶成千上萬的話,服務器就很難招架得住了。

并且這是基于cookie來實現的,因此數據很容易被截獲,因此不太安全

jwt相比前者,主要有以下優勢:

  • 簡潔:可以通過在HTTP中的header發送,因此數據量比較少,傳輸速度比較快
  • 自包含:負載中包含了所有用戶所需的信息,避免了多次查詢數據庫
  • 可跨域:jwt是以json格式家里存儲在客戶端的,因此,jwt是可以跨語言的

2、JWT的結構

jwt的組成

  • 標頭
  • 有效負荷
  • 簽名(重要,不可泄漏出去)

2.1、標頭(Header)

標頭通常由兩部分組成

第一個是令牌類型。一般是JWT

第二個則是所使用的簽名算法。比如HMACSHA256算法或者RSA

標頭通常是由Base64編碼組成JWT結構的一部分,但是注意的是Base64編碼是一種編碼,而不是一種加密過程

通常標頭不需要規定

{"alg": "HS256","typ": "JWT" }

2.2、有效負荷(Payload)

有效負荷是包含聲明,例如實體類有關的信息,比如說username等等,同樣的是使用Base64編碼的

{"usename": "zhangsan","admin": true }

2.3、簽名(Signature)

簽名是由編碼后的標頭和有效負荷以及我們提供的一個密鑰,然后使用標頭規定的簽名算法進行簽名

因此,簽名的作用主要是保證JWT沒有被篡改過

之所以能保證JWT沒有被篡改,是因為如下過程

當后端傳輸數據給前端的時候,jwt會將標頭和有效負荷進行Base’64編碼,然后再用這兩部分得到的編碼字符串再加上自己定義的一個密鑰,再使用標頭規定的加密算法,從而得到一個簽名,假設得到的這個簽名是ABC

當這個jwt傳到前端的時候,就可以利用Base64解碼,從而獲取當中的某些數據,當前端需要請求的時候,也會將這個jwt傳給后端,假設這過程中的有效負荷被篡改了,那么后端接受到這個jwt的時候就會先進行驗簽,將得到的jwt的標頭和有效負荷再加上自己的密鑰來進行加密,這時候肯定得到的不再是ABC,假設得到的是ABD,ABD與ABC一對比明顯不一樣,因此就可以判斷當中內容被篡改了,最終拒絕訪問。

這當中也依然存在安全問題,主要是因為Base64是可以解碼的,因此我們的傳輸的信息依然會被暴露,jwt一般不用傳輸敏感信息。

JWT一般用來設計用戶認證和授權系統,甚至實現Web應用的單點登錄


二、SpringBoot整合JWT

<!--引入jwt--> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version> </dependency> //生成Token Calendar instance = Calendar.getInstance(); instance.add(Calendar.SECOND, 90); String token = JWT.create()//生成令牌.withClaim("username", "李四")//設置自定義用戶名.withExpiresAt(instance.getTime())//設置過期時間.sign(Algorithm.HMAC256("DSADA_23#@#@$!GDFGS"));//設置簽名 保密 復雜 System.out.println(token);//輸出令牌

像這樣生成Token可以寫成一個JWTUtils,增加代碼的復用性

public class JWTUtils {//定義自己的密鑰private static String TOKEN = "token!DASD(#$dsad%$#.";/*** 生成token* @param map 傳入的有效負荷* @return*/public static String genToken(Map<String, String> map){JWTCreator.Builder builder = JWT.create();map.forEach((k,v)->{builder.withClaim(k, v);});Calendar instance = Calendar.getInstance();//定義過期時間instance.add(Calendar.DATE, 7);builder.withExpiresAt(instance.getTime());return builder.sign(Algorithm.HMAC256(TOKEN)).toString();}/*** 驗證獲取token中的有效負載,驗證失敗返回null* @param token* @return*/public static DecodedJWT getToken(String token){return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);} }

為了使得不用在每一個controller前端控制器都寫一遍獲取token,然后驗簽的操作

可以將這個操作寫在過濾器中,這樣的話將token放在請求體中請求,可以簡化不少操作

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.verify(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","token算法不一致!");}catch (Exception e){e.printStackTrace();map.put("msg","token無效!!");}map.put("state",false);//設置狀態//將map 專為json jacksonString json = new ObjectMapper().writeValueAsString(map);response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);return false;} }

配置過濾器

@Configuration public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new JWTInterceptor())//其他接口token驗證.addPathPatterns("/user/test") //所有用戶都放心.excludePathPatterns("/user/login"); } }

編寫前端控制器controller

package com.baizhi.controller;import com.auth0.jwt.exceptions.AlgorithmMismatchException; import com.auth0.jwt.exceptions.SignatureVerificationException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.auth0.jwt.interfaces.DecodedJWT; import com.baizhi.entity.User; import com.baizhi.service.UserService; import com.baizhi.utils.JWTUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map;@RestController @Slf4j public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user/login")public Map<String,Object> login(User user){log.info("用戶名: [{}]",user.getName());log.info("密碼: [{}]",user.getPassword());Map<String, Object> map = new HashMap<>();try{User userDB = userService.login(user);Map<String,String> payload = new HashMap<>();payload.put("id",userDB.getId());payload.put("name",userDB.getName());//生成JWT的令牌String token = JWTUtils.getToken(payload);map.put("state",true);map.put("msg","認證成功");map.put("token",token);//響應token}catch (Exception e){map.put("state",false);map.put("msg",e.getMessage());}return map;}@PostMapping("/user/test")public Map<String,Object> test(HttpServletRequest request){Map<String, Object> map = new HashMap<>();//處理自己業務邏輯String token = request.getHeader("token");DecodedJWT verify = JWTUtils.verify(token);log.info("用戶id: [{}]",verify.getClaim("id").asString());log.info("用戶name: [{}]",verify.getClaim("name").asString());map.put("state",true);map.put("msg","請求成功!");return map;}}

注意token會作為參數傳給前端

總結

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

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

主站蜘蛛池模板: 亚洲伊人精品 | 欧美一区二区在线视频 | 香蕉视频99 | 男人的天堂久久久 | 最新视频 - 88av | 日本视频www | 亚洲一二三级 | 性色一区二区 | 天天干天天操天天玩 | 91免费 看片 | 久久久三级视频 | 久久免费看少妇高潮v片特黄 | 91美女视频| 97精品久久久 | 国产又黄又大又粗的视频 | 夜色一区二区 | 午夜精品久久久久久久99 | 日本三级影院 | 日韩黄色免费 | 欧美日韩不卡视频 | 久久久久无码精品国产 | 亚洲男人第一av | 久久亚洲第一 | 亚洲精品无amm毛片 国内一区二区三区 | 毛片在线网 | 午夜精品在线免费观看 | 97中文字幕在线观看 | 国产精品xxxx喷水欧美 | 一级黄色短视频 | 久久r视频 | 亚洲a一区二区 | 人妻少妇偷人精品无码 | 91片黄在线观看喷潮 | 国产麻豆电影在线观看 | 日本美女裸体视频 | 玩弄白嫩少妇xxxxx性 | 国产精品久久久久野外 | 男人舔女人下部高潮全视频 | 第四色成人网 | 日本一区视频在线观看 | 亚洲乱色熟女一区二区三区 | 欧美精品在线观看 | 欧美二级片 | 日韩一区二区在线播放 | 国产成人精品免费视频 | 男人午夜影院 | 日本一区二区在线免费 | 日韩美女做爰高潮免费 | 无码国产色欲xxxxx视频 | 日本在线免费观看视频 | 国产三级在线 | 欧美视频免费看欧美视频 | 中文字幕在线视频日韩 | 日韩精品一二三四区 | 亚洲午夜毛片 | 成人深夜福利 | 亚洲性图一区二区 | 久久久久久久久久99 | 黑人一区二区三区四区五区 | 色av导航 | 91大神一区二区 | 精品1卡二卡三卡四卡老狼 日韩三级网 | 亚洲激情欧美色图 | 日婷婷| av在线手机观看 | 精品国产av鲁一鲁一区 | 亚洲先锋影音 | 久久高清无码视频 | 午夜xxx| 亲切的金子餐桌片段的金子 | 操伊人 | av丝袜天堂 | 亚洲iv一区二区三区 | 国产精品视频1区 | 精品国产免费人成在线观看 | 久草成人在线视频 | www国产亚洲精品久久麻豆 | 亚洲人精品午夜射精日韩 | 神马国产| 亚洲精品1234| 自拍偷拍视频网站 | 中文字幕二区 | 日韩福利视频在线观看 | 亚洲人成小说 | 黄色三级生活片 | 成年人国产精品 | 国产精品福利导航 | 草一色| 国产91麻豆视频 | 欧美三级一级片 | 深夜影院深a | 黄色一级视频免费看 | 91精品专区 | 色爱色| 国产日韩精品一区 | 在线理论视频 | 操小妹影院 | 国产精品日日摸夜夜爽 | 97青青草|