成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

關(guān)于同一賬號(hào)多人同時(shí)登錄的token重復(fù)問(wèn)題

Gemini / 1567人閱讀

摘要:最近在項(xiàng)目上遇到了一個(gè)同一賬號(hào)多終端或者說(shuō)多用戶(hù)同時(shí)登錄導(dǎo)致的重復(fù)問(wèn)題。修改后的偽代碼如下同一賬號(hào)不能同時(shí)登錄用戶(hù)不存在當(dāng)有兩個(gè)線(xiàn)程進(jìn)入到,第一個(gè)線(xiàn)程會(huì)修改版本號(hào)并插入,而第二個(gè)線(xiàn)程則會(huì)因?yàn)榘姹咎?hào)不一致,拋出異常。

最近在項(xiàng)目上遇到了一個(gè)同一賬號(hào)多終端(或者說(shuō)多用戶(hù))同時(shí)登錄導(dǎo)致的token重復(fù)問(wèn)題??梢栽跒g覽器相應(yīng)地做一些防止表單重復(fù)提交的操作,比如登錄按鈕點(diǎn)擊一次后變成不可點(diǎn)擊的狀態(tài),等待服務(wù)器的響應(yīng)之后再恢復(fù)成點(diǎn)擊狀態(tài)。不過(guò)這也并不能解決同一賬號(hào)多終端登錄的問(wèn)題。

https://github.com/bluesnail9...

項(xiàng)目中的偽代碼如下:
User user = getUser(username,password);
if(null != user) {
    String token = findToken(user);
    if(null != token) {
    user.deleteToken(user);
        token = null;
    }
    if(null == token){
        user.insertNewToken(user);
    }    
}else {
    throw new Exception("用戶(hù)不存在");
}
想一想:

為什么會(huì)出現(xiàn)token重復(fù)的問(wèn)題?因?yàn)橥毁~號(hào)多用戶(hù)(或者多終端)同時(shí)登錄時(shí)都進(jìn)入到了if(null == token)這個(gè)語(yǔ)句,所以就向數(shù)據(jù)庫(kù)中插入了多個(gè)token,但是按道理,一個(gè)賬號(hào),只能對(duì)應(yīng)一個(gè)token。

那如何解決這個(gè)問(wèn)題呢?

(1)我開(kāi)始想到的是做一個(gè)同步,用synchronized同步語(yǔ)句塊。

User user = getUser(username,password);
if(null != user) {
    //使用synchronized做同步
    synchronized(username.intern()){
        String token = findToken(user);
        if(null != token) {
        user.deleteToken(user);
            token = null;
        }
        if(null == token){
            user.insertNewToken(user);
        }     
    }
}else {
    throw new Exception("用戶(hù)不存在");
}

synchronized括號(hào)里的內(nèi)容應(yīng)該寫(xiě)什么呢?User實(shí)例(對(duì)象)?每個(gè)線(xiàn)程的User實(shí)例都是不一樣的。username變量?試了不起作用。username并不是在編譯期就可知的,而是在運(yùn)行期從瀏覽器傳遞到后臺(tái)。修改成username.intern()是可以成功的,intern()方法會(huì)在常量池中查找和創(chuàng)建字符串。

(2)使用鎖ReentrantLock做同步

//定義鎖
private ReentrantLock lock = new ReentrantLock();
User user = getUser(username,password);
if(null != user) {  
    try{
        //獲取鎖
        lock.lock();
        String token = findToken(user);
        if(null != token) {
        user.deleteToken(user);
            token = null;
        }
        if(null == token){
            user.insertNewToken(user);          
        }     
    }catch(Exception e) {
        e.printStackTrace();
    }finally {
        //釋放鎖
        lock.unlock();
    }
}

注意:定義一個(gè)私有公共的ReentrantLock,獲取鎖是調(diào)用lock()方法,釋放鎖調(diào)用unlock()方法。如果對(duì)于每一個(gè)線(xiàn)程都需要加鎖和釋放鎖,性能會(huì)比較低。

(3)使用數(shù)據(jù)庫(kù)的樂(lè)觀鎖實(shí)現(xiàn)。

在用戶(hù)表上添加一個(gè)表示版本的字段。每次用戶(hù)登錄添加token時(shí),都需要進(jìn)行版本的比較,只有版本一致時(shí),才進(jìn)行添加token操作。

修改后的偽代碼如下:

User user = getUser(username,password);
if(null != user) {
    String token = findToken(user);
    if(null != token) {
    user.deleteToken(user);
        token = null;
    }
    if(null == token){
        int version = getUserVersion(user.getId());    
        if(version == user.getVersion()) { 
             updateVersion(version+1,User);
             user.insertNewToken(user);
         }else {
             throw new Exception("同一賬號(hào)不能同時(shí)登錄");
         }
    }
}else {
    throw new Exception("用戶(hù)不存在");
}

當(dāng)有兩個(gè)線(xiàn)程進(jìn)入到if(null == token),第一個(gè)線(xiàn)程會(huì)修改版本號(hào)并插入token,而第二個(gè)線(xiàn)程則會(huì)因?yàn)榘姹咎?hào)不一致,拋出異常。

參考文章:

https://blog.csdn.net/u014653...

https://blog.csdn.net/antony9...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71246.html

相關(guān)文章

  • git實(shí)現(xiàn)github協(xié)同開(kāi)發(fā)

    摘要:生成在控制臺(tái)中繼續(xù)輸入,生成密鑰。將文件夾中的公鑰添加到管理平臺(tái)中,在的個(gè)人賬戶(hù)的設(shè)置中找到如下界面。添加到暫存區(qū)后,我們會(huì)發(fā)現(xiàn)這兩個(gè)文件的顏色變?yōu)榱司G色。在熟悉以后,可能會(huì)發(fā)現(xiàn)有更加簡(jiǎn)潔快速的提交修改的使用方法。在開(kāi)發(fā)項(xiàng)目時(shí),往往不是一個(gè)人進(jìn)行項(xiàng)目開(kāi)發(fā),而通常是以團(tuán)隊(duì)的形式進(jìn)行開(kāi)發(fā)一個(gè)新功能,那項(xiàng)目開(kāi)發(fā)是如何進(jìn)行多人高效協(xié)作的呢?在不同的開(kāi)發(fā)階段,我們遇到各種各樣的問(wèn)題,當(dāng)遇到這些問(wèn)題時(shí),...

    Tecode 評(píng)論0 收藏0
  • vue微信網(wǎng)頁(yè)授權(quán)最終解決方案

    摘要:微信網(wǎng)頁(yè)授權(quán),基于適配方案,開(kāi)發(fā)的微信授權(quán)方案。項(xiàng)目地址又又又一次來(lái)寫(xiě)微信網(wǎng)頁(yè)授權(quán),一年前寫(xiě)過(guò)的微信授權(quán)解決方案。 vue微信網(wǎng)頁(yè)授權(quán),基于vue-cli3.0+webpack 4+vant ui + sass+ rem適配方案+axios,開(kāi)發(fā)的微信授權(quán)方案。項(xiàng)目地址:vue-wechat-auth 又又又一次來(lái)寫(xiě)微信網(wǎng)頁(yè)授權(quán),一年前寫(xiě)過(guò)的 [vue 微信授權(quán)解決方案]。 參考了[v...

    wawor4827 評(píng)論0 收藏0
  • 號(hào)外:友戶(hù)通支持企業(yè)自有用戶(hù)中心啦

    摘要:針對(duì)這種情況,友戶(hù)通特定開(kāi)發(fā)了聯(lián)邦用戶(hù)中心來(lái)支持企業(yè)的自有用戶(hù)中心。友戶(hù)通支持通過(guò)協(xié)議使用企業(yè)內(nèi)部的支持協(xié)議的用戶(hù)中心賬號(hào)進(jìn)行登錄。友戶(hù)通目前支持標(biāo)準(zhǔn)協(xié)議以及友戶(hù)通自定義協(xié)議可供企業(yè)集成。 友戶(hù)通做用友云的用戶(hù)系統(tǒng)也一年多了,經(jīng)常聽(tīng)實(shí)施、售前等說(shuō)要私有化部署友戶(hù)通,原因無(wú)非是企業(yè)的考慮到用戶(hù)安全性和單一用戶(hù)賬號(hào)的需求。但由于用戶(hù)管理的復(fù)雜性,友戶(hù)通部署與維護(hù)并不容易,因此經(jīng)常糾結(jié)在用戶(hù)...

    妤鋒シ 評(píng)論0 收藏0
  • JWT、OAuth 2.0、session 用戶(hù)授權(quán)實(shí)戰(zhàn)

    摘要:為用戶(hù)提供授權(quán)以允許用戶(hù)操作非公開(kāi)資源,有很多種方式。具體的代碼根據(jù)不同的授權(quán)方案而有所不同。使用授權(quán)原理利用來(lái)驗(yàn)證用戶(hù),有兩種機(jī)制實(shí)現(xiàn)。使用來(lái)實(shí)現(xiàn)用戶(hù)授權(quán)主要用于簽發(fā)如果有將異步的簽名。注意這里的與之前用于簽發(fā)的應(yīng)該是同一個(gè)。 在很多應(yīng)用中,我們都需要向服務(wù)端提供自己的身份憑證來(lái)獲得訪(fǎng)問(wèn)一些非公開(kāi)資源的授權(quán)。比如在一個(gè)博客平臺(tái),我們要修改自己的博客,那么服務(wù)端要求我們能夠證明 我是...

    Jochen 評(píng)論0 收藏0
  • 利用新浪API實(shí)現(xiàn)數(shù)據(jù)抓取微博數(shù)據(jù)爬取微博爬蟲(chóng)

    摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶(hù)傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢(xún)我的郵箱,如果是為了學(xué)習(xí)爬蟲(chóng),...

    liuyix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<