成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

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

封裝JTW生成token和校驗方法

public class JwtTokenUtil {

  //公用密鑰-保存在服務端,客戶端是不會知道密鑰的,以防被攻擊
  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碼生") //設置 載荷 Payload
          //.withClaim("age","12")
          //.withClaim( "org","測試")
          //.withExpiresAt(expiresDate)//設置過期時間,過期時間要大于簽發(fā)時間
          //.withIssuedAt(iatDate)//設置簽發(fā)時間
          .withAudience(username) //設置 載荷 簽名的觀眾
          .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;
}

關于攔截器配置:

@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注釋,有則跳過認證
    if (method.isAnnotationPresent(PassToken.class)) {
      PassToken passToken = method.getAnnotation(PassToken.class);
      if (passToken.required()) {
        return true;
      }
    }
    //檢查有沒有需要用戶權限的注解
    if (method.isAnnotationPresent(UserLoginToken.class)) {
      UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
      if (userLoginToken.required()) {
        // 執(zhí)行認證
        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無權限。

測試:

@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,返回失?。?/p>

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

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

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

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

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

廣告

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

商城網(wǎng)站建設
新津县| 新化县| 卢氏县| 彝良县| 松滋市| 盈江县| 鄂托克旗| 黄平县| 桂阳县| 宜宾县| 微博| 包头市| 商都县| 喀什市| 陕西省| 若尔盖县| 凤山市| 凯里市| 永春县| 合川市| 南乐县| 沾化县| 丰原市| 尼勒克县| 平定县| 化州市| 类乌齐县| 连平县| 同仁县| 崇文区| 太康县| 信阳市| 内乡县| 安远县| 济源市| 东明县| 松溪县| 城固县| 云阳县| 寿光市| 化德县|