欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析

這篇文章主要講解了springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供云浮企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站建設(shè)、做網(wǎng)站、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為云浮眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

一 前言

此篇文章的內(nèi)容也是學(xué)習(xí)不久,終于到周末有時(shí)間碼一篇文章分享知識(shí)追尋者的粉絲們,學(xué)完本篇文章,讀者將對(duì)token類(lèi)的登陸認(rèn)證流程有個(gè)全面的了解,可以動(dòng)態(tài)搭建自己的登陸認(rèn)證過(guò)程;對(duì)小項(xiàng)目而已是個(gè)輕量級(jí)的認(rèn)證機(jī)制,符合開(kāi)發(fā)需求;

二 jwt實(shí)現(xiàn)登陸認(rèn)證流程

  • 用戶使用賬號(hào)和面發(fā)出post請(qǐng)求
  • 服務(wù)器接受到請(qǐng)求后使用私鑰創(chuàng)建一個(gè)jwt,這邊會(huì)生成token
  • 服務(wù)器返回這個(gè)jwt給瀏覽器
  • 瀏覽器需要將帶有token的jwt放入請(qǐng)求頭
  • 每次手到客戶端請(qǐng)求,服務(wù)器驗(yàn)證該jwt的token
  • 驗(yàn)證成功返回響應(yīng)的資源給瀏覽器。否則異常處理
     

三 相關(guān)介紹jwt

3.1jwt 組成

JWT的token由三段信息構(gòu)成的,將這三段信息文本用.連接一起就構(gòu)成了JWT字符串;

  • Header 頭部(包含了令牌的元數(shù)據(jù),并且包含簽名和或加密算法的類(lèi)型)
  • Payload 負(fù)載
  • Signature 簽名/簽證

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg

3.2 jwt優(yōu)點(diǎn)

  • 簡(jiǎn)潔(Compact): 可以通過(guò)URL,POST參數(shù)或者在HTTP header發(fā)送,數(shù)據(jù)量小,傳輸速度快
  • 自包含(Self-contained):負(fù)載中包含了所有用戶所需要的信息,避免多次查詢(xún)數(shù)據(jù)庫(kù)
  • .因?yàn)門(mén)oken是以JSON加密的形式保存在客戶端的,所以JWT是跨語(yǔ)言支持;
  • 不需要在服務(wù)端保存會(huì)話信息,適用于分布式與微服務(wù);

四 jwt用戶登陸發(fā)放token

4.1 pom.xml

項(xiàng)目構(gòu)件如下

  • springboot 2.1;
  • jwt 3.4.0;
  • maven 3.5
  • jdk1.8
  • postman接口測(cè)試
<dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>com.auth0</groupId>
   <artifactId>java-jwt</artifactId>
   <version>3.4.0</version>
  </dependency>
  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
  </dependency>
 </dependencies>

4.2jwt工具類(lèi)

jwt工具類(lèi)中有三個(gè)方法,分別是生成數(shù)字簽名用于用戶首次登陸時(shí)發(fā)送jwt給客戶端;其次是校驗(yàn)方法,用于攔截器攔截所有規(guī)則內(nèi)的url,每個(gè)請(qǐng)求都必須帶有服務(wù)器發(fā)送的jwt,經(jīng)過(guò)驗(yàn)證后才放行請(qǐng)求;最后一個(gè)獲得用戶名的方法用于查詢(xún)密鑰,在驗(yàn)證jwt時(shí)作為參數(shù)傳入;

/* *
 * @Author lsc
 * <p> JWT工具類(lèi) </p>
 * @Param
 * @Return
 */
public class JwtUtil {

 // Token過(guò)期時(shí)間30分鐘
 public static final long EXPIRE_TIME = 30 * 60 * 1000;

 /* *
 * @Author lsc
 * <p> 校驗(yàn)token是否正確 </p>
 * @Param token
 * @Param username
 * @Param secret
 * @Return boolean
 */
 public static boolean verify(String token, String username, String secret) {
 try {
 // 設(shè)置加密算法
 Algorithm algorithm = Algorithm.HMAC256(secret);
 JWTVerifier verifier = JWT.require(algorithm)
  .withClaim("username", username)
  .build();
 // 效驗(yàn)TOKEN
 DecodedJWT jwt = verifier.verify(token);
 return true;
 } catch (Exception exception) {
 return false;
 }
 }

 /* *
 * @Author lsc
 * <p>生成簽名,30min后過(guò)期 </p>
 * @Param [username, secret]
 * @Return java.lang.String
 */
 public static String sign(String username, String secret) {
 Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
 Algorithm algorithm = Algorithm.HMAC256(secret);
 // 附帶username信息
 return JWT.create()
 .withClaim("username", username)
 .withExpiresAt(date)
 .sign(algorithm);

 }

 /* *
 * @Author lsc
 * <p> 獲得用戶名 </p>
 * @Param [request]
 * @Return java.lang.String
 */
 public static String getUserNameByToken(HttpServletRequest request) {
 String token = request.getHeader("token");
 DecodedJWT jwt = JWT.decode(token);
 return jwt.getClaim("username")
 .asString();
 }
}

4.3 用戶實(shí)體

實(shí)體中包含用戶名,和密碼,一切從簡(jiǎn);

/**
 * @Author lsc
 * <p> </p>
 */
@Data
public class SysUser {
 private String username;
 private String password;
}

4.4Controller

表現(xiàn)層代碼用戶用戶登陸認(rèn)證,認(rèn)證成功后發(fā)放token給客戶端;

/**
 * @Author lsc
 * <p> </p>
 */
@RestController
public class SysUserController {

 @PostMapping(value = "/login")
 public Map<String, Object> login(@RequestBody SysUser sysUser){
  Map<String, Object> map = new HashMap<>();
  String username = sysUser.getUsername();
  String password = sysUser.getPassword();
  // 省略 賬號(hào)密碼驗(yàn)證
  // 驗(yàn)證成功后發(fā)送token
  String token = JwtUtil.sign(username,password);
  if (token != null){
   map.put("code", "200");
   map.put("message","認(rèn)證成功");
   map.put("token", token);
   return map;
  }
  map.put("code", "403");
  map.put("message","認(rèn)證失敗");
  return map;
 }
}

4.5 測(cè)試

測(cè)試url http://localhost:8080/login

postman post請(qǐng)求測(cè)試參數(shù)如下

{
 "username": "zszxz",
 "password": "zszxz"
}

返回內(nèi)容如下

{
 "code": "200",
 "message": "認(rèn)證成功",
 "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg"
}

五 jwt登陸攔截認(rèn)證

基于前面已經(jīng)實(shí)現(xiàn)jwt登錄認(rèn)證后發(fā)放token給客戶端;本節(jié)內(nèi)容就是將token放入請(qǐng)求頭中發(fā)送請(qǐng)求給服務(wù)器;服務(wù)器使用攔截器攔截請(qǐng)求對(duì)token進(jìn)行驗(yàn)證;驗(yàn)證成功請(qǐng)求通過(guò),否則請(qǐng)求資源失?。?/p>

5.1自定義攔截器

自定義攔截器JwtInterceptor,實(shí)現(xiàn)HandlerInterceptor接口,每次請(qǐng)求到達(dá)之前都會(huì)驗(yàn)證token是否有效;

/**
 * @Author lsc
 * <p>token驗(yàn)證攔截器 </p>
 */
@Component
public class JwtInterceptor implements HandlerInterceptor {

 @Autowired
 SysUserService sysUserService;

 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  // 從 http 請(qǐng)求頭中取出 token
  String token = request.getHeader("token");
  // 如果不是映射到方法直接通過(guò)
  if(!(handler instanceof HandlerMethod)){
   return true;
  }
  if (token != null){
   String username = JwtUtil.getUserNameByToken(request);
   // 這邊拿到的 用戶名 應(yīng)該去數(shù)據(jù)庫(kù)查詢(xún)獲得密碼,簡(jiǎn)略,步驟在service直接獲取密碼
   boolean result = JwtUtil.verify(token,username,sysUserService.getPassword());
   if(result){
    System.out.println("通過(guò)攔截器");
    return true;
   }
  }
  return false;
 }

 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

 }

 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

 }
}

5.2 service

/**
 * @Author lsc
 * <p> 模擬查詢(xún)數(shù)據(jù)庫(kù)獲得賬號(hào)密碼 </p>
 */
@Service
public class SysUserService {


 public String getPassword(){
  return "zszxz";
 }
}

5.3攔截器配置

攔截器配置中主要定義攔截請(qǐng)求規(guī)則,將攔截器注入WebMvcConfigurer;cors跨域處理;

/* *
 * @Author lsc
 * <p>攔截器配置 </p>
 * @Param
 * @Return
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

 /* *
  * @Author lsc
  * <p> 設(shè)置攔截路徑 </p>
  * @Param [registry]
  * @Return void
  */
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(authenticationInterceptor())
    .addPathPatterns("/**")
    .excludePathPatterns("/login");
 }
 /* *
  * @Author lsc
  * <p> 將攔截器注入context </p>
  * @Param []
  * @Return com.zszxz.jwt.interceptor.JwtInterceptor
  */
 @Bean
 public JwtInterceptor authenticationInterceptor() {
  return new JwtInterceptor();
 }

 /* *
  * @Author lsc
  * <p>跨域支持 </p>
  * @Param [registry]
  * @Return void
  */
 @Override
 public void addCorsMappings(CorsRegistry registry) {
  registry.addMapping("/**")
    .allowedOrigins("*")
    .allowCredentials(true)
    .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD")
    .maxAge(3600 * 24);
 }
}

5.4Controller

表現(xiàn)層接口用于攔截親求測(cè)試

/**
 * @Author lsc
 * <p> </p>
 */
@RestController
public class TestController {

 @GetMapping(value = "/api/test")
 public String get(){

  return "zszxz";
 }
}

5.5 測(cè)試

測(cè)試url http://localhost:8080/api/test

發(fā)送get請(qǐng)求給服務(wù)器,帶有請(qǐng)求頭,key為token,value為用戶首次登陸時(shí)返回的token串;

測(cè)試返回內(nèi)容如下

zszxz

看完上述內(nèi)容,是不是對(duì)springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享標(biāo)題:springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析
文章網(wǎng)址:http://aaarwkj.com/article12/igohgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站收錄、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)手機(jī)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)
九九国产精品免费视频| 怡红院怡春院视频免费看| 欧美日韩在线高清一区二区| 日本一区二区三区免费精品| 韩国av高清在线观看| 国产精品成人一区二区三| av一区二区三区网站| 亚洲中文有码一区二区| 青青草青青草在线观看视频| 精品黄色大片不卡国产| 国产精品黄色91熟女| 欧美日韩在线高清一区二区| 91免费人成网站在线观看| 亚洲av毛片免费在线| 91在线免费观看国产精品| 日本中文字幕激情在线| 亚洲激情粉嫩中文字幕| 992免费影院 在线观看| 免费亚洲一区二区三区| 日本少妇人妻中文字幕| 国产亚洲中文久久网久久| 日韩在线一区中文字幕| 久久精品国产一区二区三区不卡| 91老熟女露脸大合集| 久久精品一品二品三品| 中文字幕国产精品资源| 精品人妻在线中文字幕| 日韩欧美国产综合一区二区| 69国产精品久久久久久人| 国产极品嫩模91精品| 黄色录像一级大片中国的 | 在线观看91高清视频| 99国产精品热久久婷婷| 日韩一区中文字幕久久| 亚洲永久免费精品一区二区三区 | 日本免费在线不卡一区二区| 国产精品视频一区二区三区网站| 久久伊人这里都是精品| 亚洲国产一区二区高清| 声入人心第一季在线观看| 日本少妇人妻一区二区|