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

SpringBoot通過(guò)token實(shí)現(xiàn)用戶互踢功能(具體實(shí)現(xiàn))

 更新時(shí)間:2024年04月09日 12:01:21   作者:易烊子豪  
所謂token,既用戶能夠在一定時(shí)間內(nèi)證明自己身份的一長(zhǎng)串字符串,這篇文章主要介紹了SpringBoot通過(guò)token實(shí)現(xiàn)用戶互踢功能,需要的朋友可以參考下

認(rèn)識(shí)token

所謂token,既用戶能夠在一定時(shí)間內(nèi)證明自己身份的一長(zhǎng)串字符串。正常的使用流程為:用戶第一次登入——》服務(wù)器為該用戶簽發(fā)一份token——》進(jìn)行其他服務(wù)請(qǐng)求時(shí)攜帶上token——》服務(wù)器判斷此token在有效期內(nèi)——》放行此次請(qǐng)求。

在上述過(guò)程中,用戶只有在請(qǐng)求特定的接口時(shí)可以不用攜帶token,例如登入、請(qǐng)求一些基本的公共信息等。

通過(guò)token實(shí)現(xiàn)用戶互踢

通過(guò)上述我們知道,用戶在請(qǐng)求一些接口時(shí)需要用到token進(jìn)行校驗(yàn)。那么要想通過(guò)token實(shí)現(xiàn)用戶互踢的功能,其實(shí)就變得簡(jiǎn)單了。具體思路為:

①:設(shè)立一份token白名單

②:同一個(gè)賬號(hào)多次登入時(shí),新登入的用戶將之前登入的用戶token擠出白名單

這里需要注意的是:token無(wú)法主動(dòng)設(shè)置某個(gè)token為無(wú)效狀態(tài)。這也就意味著,我們需要設(shè)置一份白名單或者黑名單。

白名單:只有在白名單內(nèi)的token才算是有效的。

黑名單:在黑名單內(nèi)的token都是無(wú)效的。

具體實(shí)現(xiàn)

這里我使用的是白名單的方法,之所以使用白名單,是因?yàn)槭褂冒酌麊嗡加玫目臻g小,因?yàn)橐粋€(gè)用戶正在有效的token只會(huì)有一個(gè),而其無(wú)效的token可能會(huì)有多個(gè)。具體步驟如下:

1、token的實(shí)現(xiàn)

package org.example.untils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class Token {
    /**
     * 過(guò)期30分鐘
     * */
    private static final long EXPIRE_TIME = 30 * 60 * 1000;
    /**
     * jwt密鑰
     * */
    private static final String SECRET = "jwt_secret";
    public static Map<String,String> map=new HashMap<>();//存放token的map集合
    public static Map<String, String> getMap() {
        return map;
    }
    public static void setMap(Map<String, String> map) {
        Token.map = map;
    }
    /**
     * 生成jwt字符串,30分鐘后過(guò)期  JWT(json web token)
     * @param account
     * @return
     * */
    public static String sign(String account) {//簽發(fā)token
        try {
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            return JWT.create()
                    //將account保存到token里面
                    .withAudience(account)
                    //五分鐘后token過(guò)期
                    .withExpiresAt(date)
                    //token的密鑰
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 根據(jù)token獲取account
     * @param token
     * @return
     * */
    public static String getAccount(String token) {
        try {
            String account = JWT.decode(token).getAudience().get(0);
            return account;
        }catch (JWTDecodeException e) {
            return null;
        }
    }
    /**
     * 校驗(yàn)token
     * @param token
     * @return
     * */
    public static boolean checkSign(String token) {
        try {
            Algorithm algorithm  = Algorithm.HMAC256(SECRET);
            JWTVerifier verifier = JWT.require(algorithm)
                    //.withClaim("username, username)
                    .build();
            verifier.verify(token);
            return true;
        } catch (JWTVerificationException e) {
            System.out.println("token無(wú)效");
            String account=Token.getAccount(token);//將該token從白名單內(nèi)移除
            if(account!=null){
                Token.map.remove(account);//移出白名單
            }
            return false;//token無(wú)效
        }
    }
}
 

上述為token的實(shí)現(xiàn),其中包括了token的簽發(fā),驗(yàn)證以及根據(jù)token獲取賬號(hào)。

2、用戶登入時(shí)的方法實(shí)現(xiàn)

@GetMapping("/login")//用戶登入
    public Result login(@Param("account") String account,@Param("password") String password){
        User user = userServiceImpl.login(account);
        if (user==null){
            return new Result(201,"賬號(hào)不存在",null);
        } else if(user.getPassword().equals(password)){//密碼正確
            Token.map.remove(account);//移除之前的token
            String token=Token.sign(account);//簽發(fā)新的token
            Token.map.put(account,token);//將新的token移入有效token
            user.setPassword("");
            return new Result(200,token,user);
        } else {
            return new Result(201,"賬號(hào)/密碼錯(cuò)誤",null);
        }
    }

從上述代碼可見(jiàn),當(dāng)?shù)侨氤晒r(shí),會(huì)將上一次登入時(shí)留下的token移除白名單,并將最近登入生成的token放入白名單。

3、通過(guò)攔截器進(jìn)行校驗(yàn)

package org.example.untils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
public class Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String token=request.getHeader("token");
        String account=Token.getAccount(token);//通過(guò)token獲取用戶賬號(hào)
        String usingToken=Token.map.get(account);//獲取該用戶最新的有效token
        if(!Objects.equals(token, usingToken)){//該token已經(jīng)失效
            response.setStatus(401);
            return false;
        }
        //檢查token
        if(Token.checkSign(token)){
            return true;
        } else {
            response.setStatus(401);
            return false;
        }
    }
}
 

在這里,我們會(huì)判斷用戶攜帶的token是否存在于白名單內(nèi),不存在則說(shuō)明這次攜帶的token是無(wú)效的。

4、對(duì)攔截器進(jìn)行注冊(cè)并放行登入等接口

package org.example.untils;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration//定義此類為配置類
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //創(chuàng)建用戶攔截器對(duì)象并指定其攔截的路徑和排除的路徑
        registry.addInterceptor(new Interceptor()).
            addPathPatterns("/**").excludePathPatterns("/user/login","/admin/login","/service/getAllServices",
                        "/shop/getShopById","/img/**");
    }
}

上述代碼為放行了登入等接口。

總結(jié)

當(dāng)然,在此次我的白名單使用的是Map存儲(chǔ)的。網(wǎng)絡(luò)上也有使用redis的好像,因?yàn)槲夷壳安](méi)有學(xué)習(xí)redis,大家感興趣的可以試試使用redis。

到此這篇關(guān)于SpringBoot通過(guò)token實(shí)現(xiàn)用戶互踢功能的文章就介紹到這了,更多相關(guān)SpringBoot用戶互踢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題

    在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題

    這篇文章主要介紹了在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring boot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ioc(2)

    Spring boot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ioc(2)

    這篇文章主要為大家詳細(xì)介紹了Spring boot實(shí)現(xiàn)一個(gè)簡(jiǎn)單ioc的第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java實(shí)現(xiàn)通訊錄管理系統(tǒng)

    java實(shí)現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Java Spring攔截器案例詳解

    Java Spring攔截器案例詳解

    這篇文章主要介紹了Java Spring攔截器案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法

    java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java實(shí)現(xiàn)彩色圖片轉(zhuǎn)換為灰度圖片的示例代碼

    Java實(shí)現(xiàn)彩色圖片轉(zhuǎn)換為灰度圖片的示例代碼

    將彩色圖片轉(zhuǎn)換為灰度圖片是圖像處理中的常見(jiàn)操作,通常用于簡(jiǎn)化圖像、增強(qiáng)對(duì)比度、或者進(jìn)行后續(xù)的圖像分析,本項(xiàng)目的目標(biāo)是通過(guò)Java實(shí)現(xiàn)將彩色圖片轉(zhuǎn)換為灰度圖片,需要的朋友可以參考下
    2025-02-02
  • Springboot使用@WebListener?作為web監(jiān)聽(tīng)器的過(guò)程解析

    Springboot使用@WebListener?作為web監(jiān)聽(tīng)器的過(guò)程解析

    這篇文章主要介紹了Springboot使用@WebListener作為web監(jiān)聽(tīng)器的過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 詳解Java如何通過(guò)Socket實(shí)現(xiàn)查詢IP

    詳解Java如何通過(guò)Socket實(shí)現(xiàn)查詢IP

    在本文中,我們來(lái)學(xué)習(xí)下如何找到連接到服務(wù)器的客戶端計(jì)算機(jī)的IP地址。我們將創(chuàng)建一個(gè)簡(jiǎn)單的客戶端-服務(wù)器場(chǎng)景,讓我們探索用于TCP/IP通信的java.net?API,感興趣的可以了解一下
    2022-10-10
  • 基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    Maven是一個(gè)插件執(zhí)行框架,所有工作都由插件完成,同時(shí)?Maven?基于構(gòu)建生命周期的核心概念,明確定義了構(gòu)建和分發(fā)特定工件(項(xiàng)目)的過(guò)程,接下來(lái)通過(guò)本文給大家介紹下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式為ZIP模式),需要的朋友可以參考下
    2022-09-09
  • 如何用匿名內(nèi)部類實(shí)現(xiàn) Java 同步回調(diào)

    如何用匿名內(nèi)部類實(shí)現(xiàn) Java 同步回調(diào)

    這篇文章主要介紹了如何用匿名內(nèi)部類實(shí)現(xiàn) Java 同步回調(diào),幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10

最新評(píng)論

黎城县| 全南县| 青阳县| 营口市| 韶山市| 通江县| 芜湖县| 万年县| 柘城县| 三穗县| 蒙山县| 慈溪市| 宁波市| 青铜峡市| 威信县| 高陵县| 平安县| 昌吉市| 化隆| 肃南| 上蔡县| 阿拉善左旗| 沂源县| 长阳| 云安县| 宝应县| 泰安市| 香格里拉县| 临沂市| 蒙自县| 朝阳市| 肥西县| 蒙阴县| 兴业县| 阿合奇县| 革吉县| 海城市| 本溪市| 天镇县| 沙雅县| 工布江达县|