最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成JWT生成token及校驗方法過程解析

 更新時間:2020年04月02日 15:04:03   作者:陌生街中吹起褪色故夢  
這篇文章主要介紹了SpringBoot集成JWT生成token及校驗方法過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

GitHub源碼地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git

封裝JTW生成token和校驗方法

public class JwtTokenUtil {

  //公用密鑰-保存在服務(wù)端,客戶端是不會知道密鑰的,以防被攻擊
  public static String SECRET = "ThisIsASecret";

  //生成Troke
  public static String createToken(String username) {
    //簽發(fā)時間
    //Date iatDate = new Date();
    //過地時間 1分鐘后過期
    //Calendar nowTime = Calendar.getInstance();
    //nowTime.add(Calendar.MINUTE, 1);
    //Date expiresDate = nowTime.getTime();
    Map<String, Object> map = new HashMap();
    map.put("alg", "HS256");
    map.put("typ", "JWT");
    String token = JWT.create()
          .withHeader(map)
          //.withClaim( "name","Free碼生") //設(shè)置 載荷 Payload
          //.withClaim("age","12")
          //.withClaim( "org","測試")
          //.withExpiresAt(expiresDate)//設(shè)置過期時間,過期時間要大于簽發(fā)時間
          //.withIssuedAt(iatDate)//設(shè)置簽發(fā)時間
          .withAudience(username) //設(shè)置 載荷 簽名的觀眾
          .sign(Algorithm.HMAC256(SECRET));//加密
    System.out.println("后臺生成token:" + token);
    return token;
  }

  //校驗TOKEN
  public static boolean verifyToken(String token) throws UnsupportedEncodingException{
    JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
    try {
      verifier.verify(token);
      return true;
    } catch (Exception e){
      return false;
    }
  }

  //獲取Token信息
  public static DecodedJWT getTokenInfo(String token) throws UnsupportedEncodingException{
    JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
    try{
      return verifier.verify(token);
    } catch(Exception e){
      throw new RuntimeException(e);
    }
  }

}

新建自定義注解:@UserLoginToken

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {
  boolean required() default true;
}

關(guān)于攔截器配置:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authenticationInterceptor())
        .addPathPatterns("/**");  // 攔截所有請求,通過判斷是否有 @LoginRequired 注解 決定是否需要登錄
  }
  @Bean
  public AuthenticationInterceptor authenticationInterceptor() {
    return new AuthenticationInterceptor();
  }
}
public class AuthenticationInterceptor implements HandlerInterceptor {
  @Autowired
  UserService userService;
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
    String token = httpServletRequest.getHeader("token");// 從 http 請求頭中取出 token
    // 如果不是映射到方法直接通過
    if(!(object instanceof HandlerMethod)){
      return true;
    }
    HandlerMethod handlerMethod=(HandlerMethod)object;
    Method method=handlerMethod.getMethod();
    //檢查是否有passtoken注釋,有則跳過認(rèn)證
    if (method.isAnnotationPresent(PassToken.class)) {
      PassToken passToken = method.getAnnotation(PassToken.class);
      if (passToken.required()) {
        return true;
      }
    }
    //檢查有沒有需要用戶權(quán)限的注解
    if (method.isAnnotationPresent(UserLoginToken.class)) {
      UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
      if (userLoginToken.required()) {
        // 執(zhí)行認(rèn)證
        if (token == null) {
          throw new RuntimeException("無token,請重新登錄");
        }
        // 驗證 token
        if(JwtTokenUtil.verifyToken(token)){
          return true;
        }else {
          throw new RuntimeException("401");
        }
      }
    }
    return true;
  }
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  }
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  }
}

登錄:

在Controller上登錄方法不用添加@UserLoginToken自定義注解,其余獲取后臺數(shù)據(jù)方法加上@UserLoginToken自定義注解,目的驗證token是否有效,是則返回數(shù)據(jù),否則提示401無權(quán)限。

測試:

@Controller
@RequestMapping(path = "/api")
public class IndexController {

  private String prefix = "index/";

  @GetMapping("/index")
  public String index()
  {
    return prefix + "index";
  }

  @UserLoginToken
  @PostMapping("/test")
  @ResponseBody
  public Object test(){
    Map<String,Object> map = new HashMap<>();
    map.put("code","200");
    map.put("message","你已通過驗證了");
    return map;
  }
}

HTTP請求帶上登陸成功后生成token,返回成功:

HTTP請求帶上無效token或不帶token,返回失?。?/p>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis plus代碼生成工具的實現(xiàn)代碼

    mybatis plus代碼生成工具的實現(xiàn)代碼

    這篇文章主要介紹了mybatis plus代碼生成工具的實現(xiàn)代碼,需要的朋友可以參考下
    2021-04-04
  • Ajax登錄驗證實現(xiàn)代碼

    Ajax登錄驗證實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了jQuery+ajax實現(xiàn)用戶登錄驗證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java密鑰交換算法DH定義與應(yīng)用實例分析

    java密鑰交換算法DH定義與應(yīng)用實例分析

    這篇文章主要介紹了java密鑰交換算法DH定義與應(yīng)用,結(jié)合實例形式分析了Java密鑰交換算法DH的原理、定義、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-09-09
  • WebService教程詳解(二)

    WebService教程詳解(二)

    這篇文章主要介紹了WebService教程詳解(二) 的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • Spring MVC異常處理機(jī)制示例詳解

    Spring MVC異常處理機(jī)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC異常處理機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring MVC具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java里volatile關(guān)鍵字是什么意思

    Java里volatile關(guān)鍵字是什么意思

    volatile具有synchronized關(guān)鍵字的“可見性”,但是沒有synchronized關(guān)鍵字的“并發(fā)正確性”,也就是說不保證線程執(zhí)行的有序性。這篇文章主要介紹了Java里volatile關(guān)鍵字是什么意思的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • MyBatis中的模糊查詢語句

    MyBatis中的模糊查詢語句

    這篇文章主要介紹了MyBatis中的模糊查詢語句的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java靜態(tài)代理與動態(tài)代理案例詳解

    Java靜態(tài)代理與動態(tài)代理案例詳解

    這篇文章主要介紹了Java靜態(tài)代理與動態(tài)代理案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • java身份證合法性校驗工具類實例代碼

    java身份證合法性校驗工具類實例代碼

    這篇文章主要給大家介紹了關(guān)于java身份證合法性校驗工具類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)

    Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)

    這篇文章主要介紹了Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01

最新評論

兴国县| 务川| 嘉兴市| 肥乡县| 启东市| 宁国市| 广东省| 湘阴县| 沭阳县| 桃源县| 绥滨县| 广德县| 宁波市| 浙江省| 湾仔区| 密山市| 宕昌县| 北京市| 神池县| 平邑县| 高淳县| 涪陵区| 呼和浩特市| 陆川县| 金门县| 贵港市| 鄂托克旗| 舞阳县| 松原市| 福清市| 如东县| 齐齐哈尔市| 辽源市| 策勒县| 河曲县| 新兴县| 芜湖市| 丹东市| 光泽县| 麦盖提县| 马鞍山市|