序文: 最近、ログイン フロントエンド:バックエンド、トークンの有効期限を長く設定できますか? バックエンド:はい、ただしそうするのは安全ではないので、より良い方法を使用できます。 フロントエンド:どのような方法ですか? バックエンド:トークンを更新するためのインターフェースを提供し、トークンを定期的に更新します フロントエンド:わかりました。ちょっと考えさせてください。 1. 需要
方法1バックエンドは有効期限を返し、フロントエンドは デメリット:バックエンドは 方法2 デメリット:リソースの浪費、パフォーマンスの消費、推奨されません。 方法3レスポンスインターセプターでインターセプトし、 2. 実装
'axios' から axios をインポートします サービスインターセプターレスポンスの使用( レスポンス => { (応答データコード === 409)の場合{ refreshToken を返します({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { トークン } = res.data setToken(トークン) レスポンス.ヘッダー.承認 = `${トークン}` }).catch(エラー => { トークンの削除() router.push('/login') Promise.reject(err) を返します。 }) } レスポンスを返す && response.data }, (エラー) => { メッセージ.エラー(error.response.data.msg) Promise.reject(error) を返します。 }) 3. 問題解決質問1: トークンの複数回の更新を防ぐ方法
'axios' から axios をインポートします サービスインターセプターレスポンスの使用( レスポンス => { (応答データコード === 409)の場合{ if (!isRefreshing) { リフレッシュ = true refreshToken を返します({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { トークン } = res.data setToken(トークン) レスポンス.ヘッダー.承認 = `${トークン}` }).catch(エラー => { トークンの削除() router.push('/login') Promise.reject(err) を返します。 }).finally(() => { リフレッシュ = false }) } } レスポンスを返す && response.data }, (エラー) => { メッセージ.エラー(error.response.data.msg) Promise.reject(error) を返します。 }) 質問 2: 2 つ以上のリクエストが同時に開始された場合、他のインターフェースはこの問題をどのように解決しますか? 2 番目の期限切れのリクエストが届くと、 最終コード: 'axios' から axios をインポートします //リフレッシュ中かどうか let isRefreshing = false // キューを再試行する let requests = [] サービスインターセプターレスポンスの使用( レスポンス => { //合意コード 409 トークンの有効期限が切れました if (response.data.code === 409) { if (!isRefreshing) { リフレッシュ = true //リフレッシュトークンインターフェースを呼び出す return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { トークン } = res.data // トークンを置き換える setToken(トークン) レスポンス.ヘッダー.承認 = `${トークン}` // トークンが更新されたら、配列メソッドrequests.forEach((cb) => cb(token))を再実行します。 リクエスト = [] // 再リクエストしてクリアするサービス(response.config) }).catch(エラー => { //ログインページにジャンプするremoveToken() router.push('/login') Promise.reject(err) を返します。 }).finally(() => { リフレッシュ = false }) } それ以外 { // 解決されていない Promise を返します 新しいPromiseを返します(resolve => { // 関数形式で解決を保存し、requests.push(token => {を実行する前に更新を待機します。 レスポンス.ヘッダー.承認 = `${トークン}` 解決(サービス(response.config)) }) }) } } レスポンスを返す && response.data }, (エラー) => { メッセージ.エラー(error.response.data.msg) Promise.reject(error) を返します。 } ) シームレストークンリフレッシュの実装方法については以上です。シームレストークンリフレッシュの実装方法の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Dockerfileを使用してDockerイメージを構築する
>>: CSS レイアウト チュートリアル: 垂直方向の中央揃えを実現する方法
序文MySQL は最も人気のあるリレーショナル データベース管理システムです。WEB アプリケーショ...
序文Node は新しいプログラミング言語ではなく、JavaScript のランタイムに過ぎないとよく...
序文ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。 1. オブジェクトスト...
目次1. 事前準備1.1 Node.jsをインストールする1.2 webpackをインストールする1...
この記事では、MySQL データベースの基礎を学ぶためによく使用されるコマンドを例を使って説明します...
序文現在、フロントエンドは主に webpack の devServer の構成を通じてクロスドメイン...
目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...
1. コンセプト1. ホットバックアップとバックアップの違いホット バックアップは高可用性 (HA)...
1. まず、サーバーの mysql にアクセスして権限を変更します。 GRANT オプション付きで、...
1. ダウンロードアドレスhttps://dev.mysql.com/downloads/mysql...
1. Tomcatのインストールパスを作成する mkdir /usr/local/tomcat 2....
検証できるデータの種類は次のとおりです a = [1,2,3,4,5,6]とします。 b = [とし...
開発中にこのような要件に遭遇したので、将来使用するために記録しました。需要背景キーボード ショートカ...
ボタンは頻繁に使用されます。ここでは、イベント処理メソッドを整理し、実装方法が多数あることを発見しま...
目次序文クエリの使用シナリオ例時間間隔クエリクエリ日付と今日の時間の比較データ一般的なサイクルタイム...