Vorwort: Als ich kürzlich an einer Anfrage arbeitete, ging es um ein Login Frontend: Backend, können Sie die Ablaufzeit des Tokens länger einstellen? Backend: Ja, aber dies ist nicht sicher. Sie können eine bessere Methode verwenden. Frontend: Welche Methode? Backend: Bietet eine Schnittstelle zum Aktualisieren von Token und aktualisiert Token regelmäßig Front-End: OK, lass mich darüber nachdenken. 1. Nachfrage Wenn Methode 1 Das Backend gibt die Ablaufzeit zurück, das Frontend bestimmt Nachteile: Das Backend muss ein zusätzliches Feld für Methode 2 Schreiben Sie einen Timer, um die Nachteile: Ressourcenverschwendung, Leistungsverbrauch, nicht zu empfehlen. Methode 3 Abfangen im Antwort-Interceptor, feststellen, dass 2. Umsetzung Das grundlegende Framework von Axios von „Axios“ importieren Dienst.Interceptors.Antwort.Verwendung( Antwort => { wenn (Antwort.Daten.Code === 409) { returniere RefreshToken({ RefreshToken: localStorage.getItem('refreshToken'), token: getToken() }).dann(res => { const { token } = res.data setzeToken(Token) Antwort.header.Authorization = `${token}` }).catch(err => { entfernenToken() router.push('/login') returniere Promise.reject(err) }) } Antwort zurückgeben && Antwort.Daten }, (Fehler) => { Nachricht.Fehler(Fehler.Antwort.Daten.Nachricht) returniere Promise.reject(Fehler) }) 3. ProblemlösungFrage 1: Wie verhindere ich mehrfache Token-Aktualisierungen? Wir verwenden eine Variable Axios von „Axios“ importieren Dienst.Interceptors.Antwort.Verwendung( Antwort => { wenn (Antwort.Daten.Code === 409) { wenn (!isRefreshing) { isRefreshing = wahr returniere RefreshToken({ RefreshToken: localStorage.getItem('refreshToken'), token: getToken() }).dann(res => { const { token } = res.data setzeToken(Token) Antwort.header.Authorization = `${token}` }).catch(err => { entfernenToken() router.push('/login') returniere Promise.reject(err) }).schließlich(() => { isRefreshing = false }) } } Antwort zurückgeben && Antwort.Daten }, (Fehler) => { Nachricht.Fehler(Fehler.Antwort.Daten.Nachricht) returniere Promise.reject(Fehler) }) Frage 2: Wie lösen andere Schnittstellen dieses Problem, wenn zwei oder mehr Anfragen gleichzeitig initiiert werden? Wenn die zweite abgelaufene Anfrage eingeht, wird Endgültiger Code: Axios von „Axios“ importieren //Ob es aktualisiert wird, let isRefreshing = false //Wiederholen Sie die Warteschlange let requests = [] Dienst.Interceptors.Antwort.Verwendung( Antwort => { //Vereinbarter Code 409, Token abgelaufen, wenn (response.data.code === 409) { wenn (!isRefreshing) { isRefreshing = true //Refresh-Token-Schnittstelle aufrufen return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { token } = res.data // Token ersetzen setzeToken(Token) Antwort.header.Authorization = `${token}` // Nachdem das Token aktualisiert wurde, führen Sie die Array-Methode requests.forEach((cb) => cb(token)) erneut aus. requests = [] // Erneut anfordern und löschen return service(response.config) }).catch(err => { //Zur Login-Seite springen removeToken() router.push('/login') returniere Promise.reject(err) }).schließlich(() => { isRefreshing = false }) } anders { // Gibt ein Promise zurück, das nicht eingelöst wurde gib ein neues Versprechen zurück (Auflösen => { // Auflösung im Funktionsformular speichern und auf Aktualisierung warten, bevor requests.push(token => { ausgeführt wird Antwort.header.Authorization = `${token}` lösen(Dienst(Antwort.config)) }) }) } } Antwort zurückgeben && Antwort.Daten }, (Fehler) => { Nachricht.Fehler(Fehler.Antwort.Daten.Nachricht) returniere Promise.reject(Fehler) } ) Dies ist das Ende dieses Artikels zur Implementierung einer nahtlosen Token-Aktualisierung. Weitere Informationen zur Implementierung einer nahtlosen Token-Aktualisierung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Erstellen Sie ein Docker-Image mit Dockerfile
>>: CSS-Layout-Tutorial: So erreichen Sie eine vertikale Zentrierung
Das World Wide Web Consortium (W3C) hat einen Entw...
Inhaltsverzeichnis Vorwort vue-cli 2.0 Version vu...
In diesem Artikel wird der spezifische Code der m...
HTML steht für Hypertext Markup Language. Heutzut...
Nach der offiziellen Veröffentlichung von Activit...
Heute stelle ich einen sehr einfachen Trick vor, ...
Auswählen oder Erstellen einer Abonnementnachrich...
In diesem Artikel wird der spezifische Code für d...
CSS3-Hintergrundbild bezogen Kompatibilität: IE9+...
Implementierungseffektdiagramm für die Navigation...
Direkt zur Konfigurationsdatei Server { listen 80...
Inhaltsverzeichnis Arithmetische Operatoren Abnor...
Abfrage der Gesamtgröße aller Datenbanken So geht...
Was ist eine Transaktion? Eine Transaktion ist ei...
Inhaltsverzeichnis 1. Konfigurieren Sie zunächst ...