簡體   English   中英

登錄后以線程安全的方式發出請求

[英]Logging in then making a request in a thread-safe way

我正在使用Java v1.7和Spring Boot v1.3.3.RELEASE。 我正在嘗試編寫一個將擊中需要身份驗證的其余端點的類。 這樣我就不必每次都希望在兩次請求之間存儲憑據時登錄。 如果我正在使用的會話已過期,我想重新登錄,然后重試。

偽代碼:

try
{
    getData(credentials);
}
catch (UnauthorizedException e)
{
    credentials = login(); // Multiple threads could get to this point
    getData(credentials);
}

但是,此代碼將是多線程的,我正在努力找出如何防止創建過多會話的方法。

歡迎提出想法。

如果每次由於其他原因而再次拋出該異常,則需要確保不會永遠循環,但這應該可行:

for (;;) {
    Credentials local = credentials;
    try {
        getData(local);
        break;
    }
    catch (UnauthorizedException e) {
        synchronized (this) {
            if (credentials == local) {
                credentials = login();
            }
        }
    }
}

只有一個線程應該能夠調用登錄方法。 其他線程將在同步塊處等待,然后意識到它已被另一個線程更新,然后重試getData()。

我認為您必須同步對登錄方法的訪問,因此只有一個線程可以訪問它並設置憑據。 如果要進入另一個線程,則必須等待,然后由已持有鎖的線程設置憑據。

偽代碼:

try {
    getData(credentials);
} catch (UnauthorizedException e) {
    synchronize(lockObject) {
        if (credentials == null) {
            credentials = login();
            getData(credentials);
        }
    }
}

在它之外,您必須將憑據設置為null,以確保if可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM