欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot下token短信驗證登入登出權(quán)限操作(token存放redis,ali短信接口)

 更新時間:2019年11月12日 10:25:30   作者:Supper波  
這篇文章主要介紹了SpringBoot下token短信驗證登入登出權(quán)限操作(token存放redis,ali短信接口),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

SpringBoot下token短信驗證登入登出(token存放redis)

不對SpringBoot進行介紹,具體的可以參考官方文檔

介紹:token基本使用,redis基本使用

思路:獲取短信(驗證并限制發(fā)送次數(shù),將code存放redis)-->登入(驗證并限制錯誤次數(shù),將用戶信息及權(quán)限放token,token放redis)-->查詢操作(略),主要將前兩點,不足的希望指出,謝謝

步驟:

1.整合Redis需要的依賴,yml自行配置,ali短信接口依賴(使用引入外部包的方式)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>ali</groupId>
  <artifactId>taobao-sdk-java-auto</artifactId>
  <scope>system</scope>
  <!--將jar包放在項目/libs/xxx.jar-->
  <systemPath>${project.basedir}/libs/taobao-sdk-java-auto.jar</systemPath>
</dependency>
.......
<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <!--打包的時候引用該屬性的包-->
          <includeSystemScope>true</includeSystemScope>
        </configuration>
      </plugin>
    </plugins>
  </build>

2.ali短信接口工具類,發(fā)送驗證碼

@Autowired
  private StringRedisTemplate redisTemplate;
....略....
//查詢是否有此用戶,記錄單位時間內(nèi)發(fā)送短信次數(shù),并限制發(fā)送次數(shù)
Account account = accountService.findByUserName(phone);
if (account==null){
 return ResultVOUtil.erro(0,"未注冊用戶");
 }
ValueOperations<String, String> ops = redisTemplate.opsForValue();
String getTimes = ops.get(account + "code");
Integer gts=getTimes==null?0:Integer.valueOf(getTimes);
if (gts>5){
 return ResultVOUtil.erro(0,"獲取短信次數(shù)過多,請稍后再試");
}
ops.set(account+"code",String.valueOf(gts+1),5,TimeUnit.MINUTES);
NoteUtils noteUtils=new NoteUtils();
String validCode = UidUtil.getValidCode(); //生成隨機數(shù)
try {
 String yzmcode = noteUtils.yzmcode(validCode, phone);
  //redis設(shè)置驗證碼有效時間5分組
 ops.set(phone,validCode,5,TimeUnit.MINUTES);
 }catch (Exception e){
   throw new YunExceptions(0,"獲取驗證碼服務(wù)器bug");
 }
 
//短信接口工具類
public class NoteUtils {
  //僅當(dāng)示例:具體參考官方文檔
  public String url="***************";
  public String appkey="****************";
  public String secret="*********************";
  public String yzmcode(String code,String telnum) throws ApiException, JSONException {
    TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
    AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
    req.setExtend( "extend" );
    req.setSmsType( "normal" );
    req.setSmsFreeSignName( "*************" );
    req.setSmsParamString( "{code:'"+code+"'}" );
    req.setRecNum(telnum);
    req.setSmsTemplateCode( "******************" );
    AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);
    return "true";
 
  }
}

3.登入驗證,并將權(quán)限保存在token,以下有token工具類,可直接copy使用

public ResultVo login(String phone, String code, HttpServletResponse response, HttpServletRequest request){
    ValueOperations<String, String> ops = redisTemplate.opsForValue(); 
    String validcode = ops.get(phone);
    String outtimes=ops.get(phone+"wrong");
    Integer ots=outtimes==null?0:Integer.valueOf(outtimes);
    if (ots>5){
      return ResultVOUtil.erro(0,"錯誤次數(shù)過多,請稍后再試");
    }
    if (validcode!=null){
      String vcode=validcode.toString();
      if (code.equalsIgnoreCase(vcode)){
        Account account = accountService.findByUserName(phone);
        if (account!=null){
          //記錄登入信息,獲取權(quán)限,字符串類型a,b,c,d
          String token = TokenUtils.tokenGet(phone, account.getDbids());
          Loglogin loglogin=new Loglogin();
          loglogin.setActionid(200);
          loglogin.setUserip(request.getRemoteAddr());
          loglogin.setUsername(phone);
          loglogin.setLogtime(Timestamp.valueOf(TimeUtil.getCurDate()));
          loglogin.setUserid(account.getUserId());
          logloginService.save(loglogin);
          設(shè)置token時效
          ops.set(phone+"token",token,60,TimeUnit.MINUTES);
          return ResultVOUtil.success(token);
        }else {
          return ResultVOUtil.erro(0,"沒有此賬戶");
        }
      }else {
        ops.set(phone+"wrong",String.valueOf(ots+1),5,TimeUnit.MINUTES);
        return ResultVOUtil.erro(0,"驗證碼錯誤");
      }
    }else {
      return ResultVOUtil.erro(0,"請先獲取驗證碼");
    }
  }
//token工具類
public class TokenUtils {
  public static String tokenGet(String username,String limits){
    Map<String,Object> map=new HashMap<>();
    map.put("alg","HS256");
    map.put("typ","JWT");
    try {
      Algorithm algorithm=Algorithm.HMAC256("*******");
      String token = JWT.create()
          .withHeader(map)
          /*設(shè)置 載荷 Payload*/
          .withClaim("loginName", username)
          .withClaim("limits",limits)
          //設(shè)置過期時間-->間隔一定時間驗證是否本人登入
          .withExpiresAt(new Date(System.currentTimeMillis()+3600000*5))
          .withIssuer("****")//簽名是有誰生成 例如 服務(wù)器
          .withSubject("*****")//簽名的主題
          .withAudience("*****")//簽名的觀眾 也可以理解誰接受簽名的
          /*簽名 Signature */
          .sign(algorithm);
      return token;
    }catch (Exception e){
      e.printStackTrace();
    }
    return null;
  }
 
  public static String validToken(String token, String dbid){
    try {
      Algorithm algorithm = Algorithm.HMAC256("*******");
      JWTVerifier verifier = JWT.require(algorithm)
          .withIssuer("SERVICE")
          .build();
      DecodedJWT jwt = verifier.verify(token);
      String subject = jwt.getSubject();
      List<String> audience = jwt.getAudience();
      Map<String, Claim> claims = jwt.getClaims();
      Claim limits = claims.get("limits");
      //驗證操作權(quán)限,set長度改變說明權(quán)限不一致
      String ss = limits.asString();
      String[] split = ss.split(",");
      Set<String> set=new HashSet<>(Arrays.asList(split));
      int size = set.size();
      set.add(dbid);
      if (set.size()!=size){
        return null;
      }else {
        Claim name = claims.get("loginName");
        return name.asString();
      }
    }catch (Exception e){
      e.printStackTrace();
    }
    return null;
  }

4.接下來都比較簡單

4.1獲取數(shù)據(jù)-->前端傳參數(shù),后臺驗證即可,

4.2退出的時候,清除redis里的token數(shù)據(jù)即可,

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

相關(guān)文章

  • Ribbon負載均衡服務(wù)調(diào)用的示例詳解

    Ribbon負載均衡服務(wù)調(diào)用的示例詳解

    Rbbo其實就是一個軟負載均衡的客戶端組件,他可以和其他所需請求的客戶端結(jié)合使用,這篇文章主要介紹了Ribbon負載均衡服務(wù)調(diào)用案例代碼,需要的朋友可以參考下
    2023-01-01
  • Java?NIO實現(xiàn)聊天室功能

    Java?NIO實現(xiàn)聊天室功能

    這篇文章主要為大家詳細介紹了Java?NIO實現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • ANSI,Unicode,BMP,UTF等編碼概念實例講解

    ANSI,Unicode,BMP,UTF等編碼概念實例講解

    這篇文章主要介紹了ANSI,Unicode,BMP,UTF等編碼概念實例講解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring中自定義Schema如何解析生效詳解

    Spring中自定義Schema如何解析生效詳解

    Spring2.5在2.0的基于Schema的Bean配置的基礎(chǔ)之上,再增加了擴展XML配置的機制。通過該機制,我們可以編寫自己的Schema,并根據(jù)自定義的Schema用自定的標(biāo)簽配置Bean,下面這篇文章主要介紹了關(guān)于Spring中自定義Schema如何解析生效的相關(guān)資料,需要的朋友可以參考下
    2018-07-07
  • Java并發(fā)編程之CountDownLatch解讀

    Java并發(fā)編程之CountDownLatch解讀

    這篇文章主要介紹了Java并發(fā)編程之CountDownLatch解讀,是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值是線程的數(shù)量,countDownLatch這個類使一個線程等待其他線程各自執(zhí)行完畢后再執(zhí)行,需要的朋友可以參考下
    2023-12-12
  • Java利用Hutool-Script封裝JS腳本執(zhí)行

    Java利用Hutool-Script封裝JS腳本執(zhí)行

    在?Java?開發(fā)中,有時需要動態(tài)執(zhí)行腳本代碼,比如?JavaScript?腳本,來實現(xiàn)一些靈活的業(yè)務(wù)邏輯,下面我們就來看看如何利用Hutool-Script模塊對Java的腳本執(zhí)行功能進行封裝吧
    2025-02-02
  • Java?在游戲中探索數(shù)組二維數(shù)組

    Java?在游戲中探索數(shù)組二維數(shù)組

    數(shù)組和二維數(shù)組感覺用王者榮耀的裝備欄來舉例解釋,應(yīng)該更易懂一些。從基礎(chǔ)開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
  • Java操作pdf文件的方法大全

    Java操作pdf文件的方法大全

    這篇文章主要為大家詳細介紹了Java操作pdf文件的相關(guān)知識,例如合并pdf文件,手繪pdf文件以及導(dǎo)出PDF文件等,有需要的小伙伴可以參考一下
    2024-04-04
  • springboot應(yīng)用服務(wù)啟動事件的監(jiān)聽實現(xiàn)

    springboot應(yīng)用服務(wù)啟動事件的監(jiān)聽實現(xiàn)

    本文主要介紹了springboot應(yīng)用服務(wù)啟動事件的監(jiān)聽實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 如何運行SpringBoot項目的方法

    如何運行SpringBoot項目的方法

    這篇文章主要介紹了如何運行SpringBoot項目的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論