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

Java令牌Token登錄與退出的實現(xiàn)

 更新時間:2020年05月26日 10:11:32   作者:Caeser110  
這篇文章主要介紹了Java令牌Token登錄與退出的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Token

之前的博客已經(jīng)介紹了各種登錄的方式,現(xiàn)在直接介紹一種現(xiàn)在比較流行的登錄方式,無狀態(tài)登錄,只需要客戶端攜帶令牌就能登陸,服務器不再存儲登錄狀態(tài)。突然粉絲量爆棚,開心死了,所以抓緊寫一篇硬核代碼,分享給大家,拿來即用的代碼,直接copy即可。

使用之前需要配置一下xml

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

下面為Java代碼

package com.caeser.midrug.util;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.time.DateUtils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.google.common.collect.Maps;

public class JwtHelper {

 private static final String SECRET = "secret";
 
 private static final String ISSURE= "caeser";
 
 public static String getToken(Map<String, String> claims) {
 Algorithm algorithm = Algorithm.HMAC256(SECRET);
 JWTCreator.Builder builder= JWT.create().withIssuer(ISSURE).withExpiresAt(DateUtils.addMinutes(new Date(), 3));
 claims.forEach((k,v) ->builder.withClaim(k, v));
 return builder.sign(algorithm).toString();
 }
 
 public static String getTokenByMinute(Map<String, String> claims,int minute) {
 Algorithm algorithm = Algorithm.HMAC256(SECRET);
 JWTCreator.Builder builder= JWT.create().withIssuer(ISSURE).withExpiresAt(DateUtils.addMinutes(new Date(), minute));
 claims.forEach((k,v) ->builder.withClaim(k, v));
 return builder.sign(algorithm).toString();
 }
 public static String getTokenByHour(Map<String, String> claims,int hour) {
 Algorithm algorithm = Algorithm.HMAC256(SECRET);
 JWTCreator.Builder builder= JWT.create().withIssuer(ISSURE).withExpiresAt(DateUtils.addHours(new Date(), hour));
 claims.forEach((k,v) ->builder.withClaim(k, v));
 return builder.sign(algorithm).toString();
 }
 
 public static Map<String, String> verifyToken(String token){
 Algorithm algorithm = Algorithm.HMAC256(SECRET);
 JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSURE).build();
 DecodedJWT jwt =verifier.verify(token);
 Map<String, Claim> map = jwt.getClaims();
 Map<String, String> resultMap = Maps.newHashMap();
 map.forEach((k,v)->resultMap.put(k,v.asString()));
 return resultMap;
 }
 public static void main(String[] args) {
 
 }
}

解釋

這段代碼其實非常簡單,作為調包俠的我們,只需要如何設置這個token生成就行了,我自己封裝了一個按分鐘和按小時校驗過期的方法。當獲取到登錄名密碼后,我們校驗通過,就可以對該用戶生成一個token然后返回給前端就行了。

package com.caeser.midrug.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.caeser.midrug.dao.UserAuthDao;
import com.caeser.midrug.dto.Meta;
import com.caeser.midrug.dto.UserAuthExe;
import com.caeser.midrug.entity.UserAuth;
import com.caeser.midrug.enums.UserAuthEnum;
import com.caeser.midrug.service.UserAuthService;
import com.caeser.midrug.util.JwtHelper;
import com.caeser.midrug.util.MD5;
import com.caeser.midrug.util.StaticVariable;

@Service
public class UserAuthServiceImpl implements UserAuthService{
 @Autowired
 UserAuthDao userAuthDao;
 
 @Override
 public UserAuthExe getAuth(String account,String password) {
 UserAuthExe userAuthExe=new UserAuthExe();
 Meta meta=new Meta();
 // 將傳過來的密碼進行MD5加密
 String inputPwd=MD5.getMd5(password);
 // 將賬號與數(shù)據(jù)庫內匹配
 UserAuth dbAuth=userAuthDao.getPwdByAccount(account);
 if(dbAuth==null) {
  // 如果賬號不存在
  meta.setMsg(UserAuthEnum.ACCOUNT_NONE.getStateInfo());
  meta.setStatus(UserAuthEnum.ACCOUNT_NONE.getState());
 }
 if(dbAuth!=null) {
  // 賬號存在
  // 判斷密碼是否正確
  if(dbAuth.getPassword().equals(inputPwd)) {
  // 密碼正確
  Map<String, String> claim=new HashMap<String, String>();
  // 存儲賬號密碼
  claim.put("account", account);
  claim.put("password", password);
  // 賬號密碼保存到token
  String token=JwtHelper.getTokenByMinute(claim, StaticVariable.LOGINTIME_MINUTE);
  // 將token存儲到返回結果
  userAuthExe.setToken(token);
  // 將用戶信息保存到返回結果
  // 返回賬號
  userAuthExe.setAcccount(account);
  // 返回用戶名
  userAuthExe.setUserName(dbAuth.getUserName());
  // 返回驗證成功信息
  meta.setMsg(UserAuthEnum.SUCCESS.getStateInfo());
  meta.setStatus(UserAuthEnum.SUCCESS.getState());
  }else {
  // 密碼錯誤
  meta.setMsg(UserAuthEnum.PWD_ERROR.getStateInfo());
  meta.setStatus(UserAuthEnum.PWD_ERROR.getState());
  }
 }
 // 存貯返回狀態(tài)
 userAuthExe.setMeta(meta);
 return userAuthExe;
 }
}

其中有一串代碼需要大家注意,雖然我的注釋很全了,但是也要分清重點。

String token=JwtHelper.getTokenByMinute(claim, StaticVariable.LOGINTIME_MINUTE);
// 將token存儲到返回結果
userAuthExe.setToken(token);

就是生成并返回給前端的部分。我們再來看前端是如何保存的,我前端使用的Vue框架來寫的。

async loginAction() {
   // 輸入判空
   if (this.loginAcStr === '' || this.loginPsStr === '') {
    return this.$message.error('請輸入密碼')
   }
   var qs = require('qs')
   const {data: res} = await axios.post(this.glAPI + '/home/login', qs.stringify({
    username: this.loginAcStr,
    password: this.loginPsStr
   }))
   var dt = res.result
   if (dt.meta.status !== 1000) {
    if (dt.meta.status === 1001) {
     return this.$message.error('賬號不存在')
    } else {
     return this.$message.error('賬號或密碼錯誤')
    }
   }
   // 密碼正確
   this.$toast('登陸成功')
   // 調用父組件方法獲取登錄信息
   this.$emit('loginGetUserIcon')
   // 保存token
   window.sessionStorage.setItem('token', dt.token)
   // 隱藏
   this.loginDrawerVisible = false
   // 調用父組件方法刷新購物車
   this.$emit('loginRefreshCart')
  }

上述代碼里window.sessionStorage.setItem('token', dt.token)這句就是保存token,那么同理注銷也是針對sessionStoragewindow.sessionStorage.clear(),怎么樣是不是很簡單呀!

分析

為了讓尋找代碼的小伙伴看到最有用的內容,上面減少了很多廢話,直接上代碼上注釋就好,下面的分析可以理解為一段可能多余的話,在以往存儲session或者cookie的時候,可以理解為一個所有瀏覽器都通用的全局變量,而token就是去除這個全局變量的,將信息保存在了客戶端本地,減輕服務器壓力,網(wǎng)上各種討論哪個好哪個有優(yōu)勢哪個有缺點,說真的,我還沒有見到實際的業(yè)務需求,所有并沒有那么深刻的體會,也無法給出詳細的解答,就目前而言,我實現(xiàn)了無狀態(tài)的登錄,而且可以校驗時間是否過期,這就夠了!

總結

就是如何生成一串字符串,如何保存,然后如何從這段字符串里分析出時間,然后判定是否過期,然后判定是否有效,就是這樣一個過程,我相信你可能或許不是很理解這個流程,但是你可以先嘗試著使用Token,我一開始是覺得很神奇的,后來想想,其實就是我們參加某次聚會,別人給你發(fā)了個工作證明,你憑這個證明就能參加會議了,只不過放到網(wǎng)絡上面確實比較抽象。

到此這篇關于Java令牌Token登錄與退出的實現(xiàn)的文章就介紹到這了,更多相關Java Token登錄與退出內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)定時任務的方法總結

    Java實現(xiàn)定時任務的方法總結

    這篇文章主要為大家詳細介紹了Java中實現(xiàn)定時任務的常用7中方法,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以參考一下
    2023-06-06
  • Java中實現(xiàn)多線程關鍵詞整理(總結)

    Java中實現(xiàn)多線程關鍵詞整理(總結)

    這篇文章主要介紹了Java中實現(xiàn)多線程關鍵詞整理,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • java通過控制鼠標實現(xiàn)屏幕廣播的方法

    java通過控制鼠標實現(xiàn)屏幕廣播的方法

    這篇文章主要介紹了java通過控制鼠標實現(xiàn)屏幕廣播的方法,針對前面一篇Java屏幕共享功能進行了改進,實現(xiàn)了鼠標控制功能,具有一定的實用價值,需要的朋友可以參考下
    2014-12-12
  • idea插件之如何使用JarEditor編輯Java JAR文件

    idea插件之如何使用JarEditor編輯Java JAR文件

    JarEditor是一款用于在IntelliJIDEA中直接編輯JAR文件的插件,支持反編譯查看和編輯.class文件,并提供即時編譯與保存功能,通過JarEditor,用戶可以在IDE內一站式完成JAR文件的編輯、管理和打包操作,提高開發(fā)效率,但在生產(chǎn)環(huán)境中使用前,請確保備份并測試修改
    2025-01-01
  • LongAdder原理及創(chuàng)建使用示例詳解

    LongAdder原理及創(chuàng)建使用示例詳解

    這篇文章主要為大家介紹了LongAdder原理及創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Spring Security賬戶與密碼驗證實現(xiàn)過程

    Spring Security賬戶與密碼驗證實現(xiàn)過程

    這篇文章主要介紹了Spring Security賬戶與密碼驗證實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • 微服務?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能

    微服務?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能

    這篇文章主要介紹了微服務?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能,文章簡單介紹了Redis BitMap 基本用法結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Java操作pdf文件的方法大全

    Java操作pdf文件的方法大全

    這篇文章主要為大家詳細介紹了Java操作pdf文件的相關知識,例如合并pdf文件,手繪pdf文件以及導出PDF文件等,有需要的小伙伴可以參考一下
    2024-04-04
  • Java實現(xiàn)京東聯(lián)盟API數(shù)據(jù)獲取功能

    Java實現(xiàn)京東聯(lián)盟API數(shù)據(jù)獲取功能

    這篇文章介紹了Java獲取京東聯(lián)盟API數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • java配置多個過濾器優(yōu)先級以及幾個常用過濾器操作

    java配置多個過濾器優(yōu)先級以及幾個常用過濾器操作

    這篇文章主要介紹了java配置多個過濾器優(yōu)先級以及幾個常用過濾器的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

鄯善县| 揭阳市| 夏河县| 准格尔旗| 北海市| 南通市| 南城县| 和静县| 同心县| 合阳县| 济宁市| 垣曲县| 昭通市| 镇江市| 孟连| 樟树市| 革吉县| 突泉县| 贺兰县| 乌鲁木齐县| 子洲县| 周宁县| 河北区| 望江县| 湘阴县| 新乐市| 通化县| 海门市| 新建县| 广饶县| 宝山区| 绥宁县| 内江市| 姚安县| 凌云县| 德化县| 射阳县| 永春县| 平陆县| 新龙县| 云阳县|