[英]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.