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
Inhaltsverzeichnis 1. Lokale Speichertechnologie ...
Wenn wir den Quellcode einer normalen Website öff...
In diesem Artikel wird die Installations- und Kon...
Manchmal möchten Sie eine App testen, aber nicht ...
Vorwort Heute habe ich MySQL installiert und fest...
Als wir nginx eingeführt haben, haben wir nginx a...
Speicherort der MySQL-Datenbank: 1. Wenn MySQL di...
Inhaltsverzeichnis Vorwort: Verschlüsselungsalgor...
Wenn ich diesen Artikel so nenne, wird vielleicht ...
Schritt 1: Den aktuellen Kernel anzeigen rew $ un...
Durch die kurze Einführung in den beiden vorherig...
Inhaltsverzeichnis Vorwort 1. Strukturdiagramm de...
1. Befehlseinführung Der Befehl contab (Cron-Tabe...
Siehe: https://www.jb51.net/article/112612.htm Üb...
Dieser Artikel basiert auf dem Free Code Camp Bas...