日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 麻豆三级 | 成人午夜淫片免费观看 | 亚洲精品少妇久久久久久 | 三上悠亚一区二区在线观看 | 999国产精品视频 | 影音先锋精品 | 午夜久久 | 巨大乳の揉んで乳榨り奶水 | 久久xxxx| 亚洲二区在线视频 | 成人福利视频网站 | 九九啪| 欧美日韩成人精品 | 国产一区二区三区影院 | 欧美不卡 | 亚洲综合精品 | 一级免费观看 | 免费在线精品视频 | 色就色欧美 | 久久免费视频播放 | 国产男人搡女人免费视频 | 欧美国产二区 | 久操精品 | 免费三级黄色 | 国产911在线观看 | 黑人干亚洲 | 亚洲国产精品va在线看黑人 | 久久一二| 欧美日韩不卡合集视频 | 亚洲爽爆av | 免费一区二区视频 | 亚洲一级影院 | 在线视频欧美亚洲 | 天天躁日日躁狠狠躁喷水 | 精品人妻互换一区二区三区 | 免费的毛片| 人人爽爽爽 | 99久久黄色| 波多野结衣一区二 | 成年人av| 小柔的淫辱日记(h | 亚洲美女视频网 | 日本三级中文字幕在线观看 | 一区二区三区在线观看视频 | 国产欧美精品一区二区三区app | 亚洲男同视频 | 相亲对象是问题学生动漫免费观看 | 亚洲专区免费 | 手机版av | 亚洲综合狠狠 | 欧美 日韩 国产 成人 在线 | 一本到在线 | 日韩大片在线 | 91插插插影库永久免费 | 国模精品一区二区三区 | 欧美日本韩国一区二区三区 | 欧美亚洲国产日韩 | 樱桃视频污污 | 亚洲国产精品视频一区二区 | 人妻一区二区三区在线 | 性欧美jzjz2| 色视频综合| 日本三级中文字幕 | 亚洲精品国产视频 | 国产在线精品福利 | 精品久草| 夜夜操操 | 无套内谢老熟女 | 欧美亚洲丝袜 | 欧美日韩激情在线一区二区三区 | 亚洲69 | 国产强被迫伦姧在线观看无码 | 欧美久久久久久又粗又大 | 黄视频网站在线看 | 国产又大又粗又长 | 国产.com| 夜夜精品一区二区无码 | 亚洲女同女同女同女同女同69 | 99免费视频 | 色婷婷狠狠爱 | 欧美zozo | 在线观看aa | 黄视频国产| www.天堂av | 激情综合五月婷婷 | 久久精品一区二区 | 黄色小视屏 | 久久无码人妻精品一区二区三区 | 午夜影院日本 | 张津瑜国内精品www在线 | 色诱视频在线观看 | 日批视频| 中文字幕不卡在线播放 | 欧美一区二区三区系列电影 | 大陆日韩欧美 | 国产乱妇4p交换乱免费视频 | 99无码熟妇丰满人妻啪啪 | 亚洲天堂小说 | 国产精品一区电影 |