SpringBoot集成JWT怎么生成token和校驗-創(chuàng)新互聯(lián)

這篇文章主要講解了“SpringBoot集成JWT怎么生成token和校驗”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SpringBoot集成JWT怎么生成token和校驗”吧!

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),石鼓企業(yè)網(wǎng)站建設(shè),石鼓品牌網(wǎng)站建設(shè),網(wǎng)站定制,石鼓網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,石鼓網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

封裝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,返回成功:

SpringBoot集成JWT怎么生成token和校驗

HTTP請求帶上無效token或不帶token,返回失敗:

SpringBoot集成JWT怎么生成token和校驗

感謝各位的閱讀,以上就是“SpringBoot集成JWT怎么生成token和校驗”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對SpringBoot集成JWT怎么生成token和校驗這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián)建站,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁標(biāo)題:SpringBoot集成JWT怎么生成token和校驗-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://muchs.cn/article16/dcjcgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)靜態(tài)網(wǎng)站、用戶體驗、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)站排名

廣告

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

商城網(wǎng)站建設(shè)