<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringBoot集成JWT

      一、JWT的簡述

      JWT 是Json Web Token的簡稱;JWT由頭部(header)、載荷(payload)、簽證(signature)三部分組成;其三部分之間用.分隔,例如:

      eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJleHAiOjE2NTkxMDU0MTIsInVzZXJuYW1lIjoiemhhbmdzYW4ifQ.ciurjE4dS3CBckl25Df6eaQvzJIuiM5Wk-LD_gfoEBs

      1. 頭部-header

      jwt的頭部承載兩部分信息

      • 聲明類型,這里時jwt
      • 聲明加密的算法,通常直接使用 HMAC SHA256

      如:

      {
        'typ': 'JWT',
        'alg': 'HS256'
      }
      使用base64加密,構(gòu)成第一部分:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

      2.載荷-payload

      載荷就是存放有效信息的地方,包含三個部分

        標準中注冊的聲明
        公共的聲明
        私有的聲明
      這其中標準中注冊的聲明(建議但不強制使用)包括如下部分

        iss : jwt簽發(fā)者
        sub: jwt面向的用戶
        aud: 接收方
        exp: jwt過期時間
        nbf: 定義在什么時間之前,jwt都是不可用的
        iat: jwt簽發(fā)時間
        jwt唯一身份標識
      公共聲明存放用戶或業(yè)務(wù)等相關(guān)信息

      私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息

      如:

      {
        "sub": "18700000000",
        "name": "songweipeng",
        "admin": true
      }

      BASE64 加密

      eyJpZCI6IjEiLCJleHAiOjE2NTkxMDU0MTIsInVzZXJuYW1lIjoiemhhbmdzYW4ifQ
      
      var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
      
      var signature = HMACSHA256(encodedString, '密鑰');

      加密之后,得到signature簽名信息。

      ciurjE4dS3CBckl25Df6eaQvzJIuiM5Wk-LD_gfoEBs

      3.簽證-signature

      jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成

      二、SpringBoot 集成

      2.1 jwt依賴

      <!-- jwt依賴 -->
      <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
      <dependency>
          <groupId>com.auth0</groupId>
          <artifactId>java-jwt</artifactId>
          <version>3.18.2</version>
      </dependency>
      

      2.2 獲取token的工具類 

      import com.auth0.jwt.JWT;
      import com.auth0.jwt.JWTCreator;
      import com.auth0.jwt.algorithms.Algorithm;
      import com.auth0.jwt.interfaces.DecodedJWT;
      import java.util.Calendar;
      import java.util.Map;
      
      /**
       * @Project:
       * @Description:
       * @Auther: songwp
       * @Date: 2022/7/22 22:23
       **/
      public class JWTUtils {
      
          private static final String SING = "@#%$^&lu123456";
      
          /**
           * 生成token
           */
          public static String getToken(Map<String,String> map){
              Calendar instance = Calendar.getInstance();
              //默認7天過期
              instance.add(Calendar.DATE,7);
              //創(chuàng)建jwt builder
              JWTCreator.Builder builder = JWT.create();
      
              map.forEach((k,v)->{
                  builder.withClaim(k,v);
              });
      
              String token = builder.withExpiresAt(instance.getTime())
                      .sign(Algorithm.HMAC256(SING));
              return token;
          }
      
          /**
           * 驗證token合法性
           */
          public static DecodedJWT verify(String token){
              return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
          }
      
         /**
          * 根據(jù)token獲取載荷信息
          * @param token
          * @return
          */
         public static Map<String, Claim> getPayloadByToken(String token) {
            return verify(token).getClaims();
         }

      2.3 創(chuàng)建攔截器

      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.fasterxml.jackson.databind.ObjectMapper;
      import com.songwp.hutooldemo.untils.JWTUtils;
      import org.springframework.web.servlet.HandlerInterceptor;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.util.HashMap;
      import java.util.Map;
      
      /**
       * @Project:
       * @Description:
       * @Auther: songwp
       * @Date: 2022/7/22 22:31
       **/
      public class JWTInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
          String token = request.getHeader("Authorization");
          Result<T> result = new Result<T>();
        try {
        //驗證令牌
        DecodedJWT verify = JwtUtils.verify(token);
        UserTokenInfoHolder.setUserTokenInfo(verify.getClaims());
        return true;
        } catch (SignatureVerificationException e) {
         e.printStackTrace();
         result.setCode(-1);
         result.setMessage("無效簽名");
        } catch (TokenExpiredException e) {
        e.printStackTrace();
        result.setCode(-1);
        result.setMessage("token過期");
        } catch (AlgorithmMismatchException e) {
        e.printStackTrace();
        result.setCode(-1);
         result.setMessage("token算法不一致");
        } catch (JWTDecodeException e) {
        e.printStackTrace();
         result.setCode(-1);
         result.setMessage("token不合法");
        } catch (NullPointerException e) {
         e.printStackTrace();
         result.setCode(-1);
        result.setMessage("token不能為空");
        } catch (Exception e) {
        e.printStackTrace();
         result.setCode(-1);
        result.setMessage("token無效");
        }
          //將返回值result轉(zhuǎn)為json
          String json = new ObjectMapper().writeValueAsString(result);
          response.setContentType("application/json;charset=UTF-8");
          response.getWriter().println(json);
          return false;
        }

      }

      2.4 攔截器注冊

      /**
      * @Project:
      * @Description:
      * @Auther: songwp
      * @Date: 2022/7/22 22:33
      **/

      import com.songwp.hutooldemo.interceptor.JWTInterceptor;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.servlet.config.annotation.CorsRegistry;
      import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
      import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

      /**
      * 注冊攔截器
      */
      @Configuration
      public class InterceptorConfig implements WebMvcConfigurer {

      /**
      * 配置跨域訪問
      * @param registry
      */
      @Override
      public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/**")//項目中的所有接口都支持跨域
      .allowedOrigins("*")//所有地址都可以訪問,也可以配置具體地址
      .allowCredentials(true)
      .allowedMethods("*")//"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"
      .maxAge(3600);// 跨域允許時間
      }

      /**
      * 注冊攔截器
      * @param registry
      */
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new JWTInterceptor())
      //攔截
      .addPathPatterns("/user/test")
      //放行
      .excludePathPatterns("/user/login");
      }

      @Bean
      public JWTInterceptor tokenInterceptor(){
      return new JWTInterceptor();
      }
      }
      posted @ 2022-07-24 18:37  [奮斗]  閱讀(432)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日本高清视频网站www| 国精品午夜福利视频| 亚洲中文字幕伊人久久无码| 色噜噜亚洲男人的天堂| 男女猛烈无遮挡免费视频| 亚洲精品色哟哟一区二区| 久草热8精品视频在线观看| 蜜桃av色偷偷av老熟女| 丁香五月天综合缴情网| 国语自产拍精品香蕉在线播放| 疯狂做受XXXX高潮国产| 欧美精品在线观看视频| 亚洲成人av在线资源| 色婷婷综合久久久久中文一区二区| 中文字幕乱妇无码av在线| 韩国三级在线 中文字幕 无码| 教育| 亚洲第一区二区快射影院| 国产精品视频中文字幕| 中文激情一区二区三区四区| 国产欧美一区二区日本加勒比| 久久精品国产福利一区二区| 国产午夜福利精品视频 | 人人妻人人狠人人爽天天综合网| 天天躁日日躁狠狠躁中文字幕| 亚洲一区二区经典在线播放| 99RE8这里有精品热视频| 国产午夜福利一区二区三区| 国产区成人精品视频| 久久精品国产亚洲av麻| 狠狠色噜噜狠狠狠狠777米奇| 国产亚洲精品aaaa片app| 亚欧洲乱码视频一二三区| 亚洲旡码欧美大片| 里番全彩爆乳女教师| 亚洲国产亚洲综合在线尤物| 久久婷婷丁香五月综合五| 人妻中文字幕亚洲精品| 精品亚洲综合一区二区三区| 强奷乱码中文字幕| 青青狠狠噜天天噜日日噜|