Wir haben die Implementierung der exklusiven Verarbeitung (Java) untersucht, wenn ein zeitgesteuertes Token für die Web-API-Authentifizierung (unter der Annahme eines OAuth2-Zugriffstokens) von mehreren Threads gemeinsam genutzt wird.
Die Spezifikationen für die Token-Verwaltung setzen Folgendes voraus.
Die Token-Verwaltungsklasse, die mit den obigen Spezifikationen arbeitet, wird wie folgt implementiert.
public class TokenManager {
//Singleton-Muster
private static TokenManager instance = new TokenManager();
private TokenManager() {}
public static TokenManager getInstance() {
return instance;
}
/*Token und Aktualisierungsdatum und -uhrzeit sollten flüchtige Variablen sein, damit immer der neueste Status zum Referenzzeitpunkt abgerufen werden kann*/
//Zeitgesteuertes Token
private volatile String token = null;
//Aktualisieren Sie Datum und Uhrzeit (UNIX-Zeitstempel), berechnet aus dem Gültigkeitszeitraum des Tokens
private volatile long refreshAt = 0L;
//Eine Synchronisierung ist nicht erforderlich, da der neueste Status mit einer flüchtigen Variablen erfasst wird.
public String getToken() {
if (System.currentTimeMillis() >= refreshAt) {
syncUpdateToken();
}
return this.token;
}
//Die Aktualisierungsverarbeitung wird synchronisiert und ausschließlich gesteuert (sodass jeweils nur ein Thread ausgeführt werden kann).
private synchronized void syncUpdateToken() {
//Führen Sie den Aktualisierungsprozess im nachfolgenden Thread, der während des Aktualisierungsprozesses getToken aufgerufen hat, nicht erneut aus
if (System.currentTimeMillis() < refreshAt) {
return;
}
//Token-Aktualisierungsprozess
//Um sicherzustellen, dass Sie das neueste Token erhalten, wenn Sie die Überprüfung des Ablaufdatums mit der Methode getToken bestehen
// token ->Aktualisieren in der Reihenfolge von refreshAt.
this.token = ...
this.refreshAt = ...
}
}
Durch die flüchtigen Variablen der Instanzvariablen (Token, RefreshAt) muss die Token-Referenzmethode (getToken) nicht synchronisiert werden, und die Referenzverarbeitung innerhalb des Token-Ablaufdatums kann parallel ausgeführt werden.
In diesem Fall wird das Ablaufdatum in der Methode erneut überprüft, da der nachfolgende Thread, der getToken während des Aktualisierungsprozesses aufgerufen hat, die Token-Aktualisierungsmethode (updateToken) aufruft, um unnötige Token-Aktualisierungsprozesse zu vermeiden.
Recommended Posts