併發導致的使用者資訊錯亂

2021-09-25 19:41:43 字數 1991 閱讀 7293

問題 多個使用者登入bi系統,假設使用者1有報表1的許可權,使用者2有報表2的許可權。但是發現有時使用者1此時無法訪問報表1,提示資訊是無許可權。。。看下使用者資訊的設定和獲取的相關**:

儲存使用者資訊的實體類,使用了treadlocal保證執行緒安全:

public class localuser 

public user getuser()

public void setuser(user user)

public string getbiuser()

public void setbiuser(string biuserinfo)

}

使用者資訊的設定

public class localsecurityfilter implements filter 

// 處理}}

使用者資訊的獲取:

userid3 = localuser.getinstance().getuser().getuserid();

username3 = localuser.getinstance().getuser().getusername();

log.info("獲取使用者資訊:"+  "   執行緒: " +thread.currentthread().getname()+" "+username3) ;

在設定使用者和獲取使用者的地方分別加日誌,然後日誌內容如下:

[info]-[2019-08-02 14:16:10]-[localsecurityfilter.dofilter():96]-[http-nio-8083-exec-7] 設定使用者資訊:mazhen   執行緒: http-nio-8083-exec-7

[info]-[2019-08-02 14:16:12]-[boardroleservice.getboarddata():86]-[http-nio-8083-exec-5] 獲取使用者資訊:   執行緒: http-nio-8083-exec-5 null

[info]-[2019-08-02 14:16:13]-[boardroleservice.getboarddata():86]-[http-nio-8083-exec-7] 獲取使用者資訊:   執行緒: http-nio-8083-exec-7 馬振

[info]-[2019-08-02 14:38:33]-[localsecurityfilter.dofilter():96]-[http-nio-8083-exec-7] 設定使用者資訊:mazhen   執行緒: http-nio-8083-exec-7

[info]-[2019-08-02 14:38:34]-[boardroleservice.getboarddata():86]-[http-nio-8083-exec-4] 獲取使用者資訊:   執行緒: http-nio-8083-exec-4 null

日誌能說明兩點:

1 可以看出 執行緒exec-7 使用者資訊都是馬振,所以一定是使用了執行緒池,而且執行緒在重複利用

2 一次頁面的面板展示會使用多執行緒進行多次請求,而不是乙個執行緒處理所有.

乙個頁面的展示,會有如下請求:

上面使用者資訊儲存的**:將使用者資訊儲存到threadlocal中,這個的確是執行緒安全的,但是因為訪問乙個頁面會同時發出多個http請求,而處理多個http請求tomcat會從執行緒池中獲取多個執行緒來併發處理。

所以上面使用者資訊的儲存僅僅是儲存到處理 滿足"/bi.html".equals(hsr.getservletpath() 要求的執行緒中,別的執行緒並沒有當前使用者的資訊,別的執行緒的使用者資訊會為空或者是別的使用者的資訊。

所以上面儲存使用者資訊的方式完全就是錯誤的,不是典型的多併發導致的問題,而是對web請求認識不清,以為某個使用者會使用同乙個執行緒。

上面的解決方案是,每個請求進來通過過濾器的時候都要設定使用者資訊,將使用者資訊設定為當前的請求對應的使用者

預設口令可能導致 iPhone 使用者資訊洩露!

iphone 的root預設口令已經不是秘密,隨便google一下就可以知道root和mobile帳號密碼就是 alpine 下面是我用自己wifi內網做的測試 pc 192.168.1.100 執行putty ftp服務 iphone 192.168.1.101 安裝了openssh 開啟了22埠...

併發事務所導致的問題

當同乙個應用程式或者不同應用程式中的多個事務在同乙個資料集上併發執行時 可能會出現許多意外的問題 併發事務所導致的問題可以分為下面三種型別 髒讀 對於兩個事物 t1,t2,t1 讀取了已經被 t2 更新但 還沒有被提交的字段 之後 若 t2 回滾 t1 讀取的內容就是臨時且無效的.不可重複讀 對於兩...

mysql 因併發操作導致的丟失更新

丟失更新產生的情況 1.事務t1查詢出一行資料,並顯示給user1。2.事務t2也查詢該行資料,並顯示給user2。3.user1修改這行記錄,更新資料庫並提交。4.user2修改這行記錄,更新資料庫並提交。在這個過程中,使用者user1的修改更新操作 丟失 了。如何避免 要避免丟失更新,需要讓這種...