序文: 最近、ログイン フロントエンド:バックエンド、トークンの有効期限を長く設定できますか? バックエンド:はい、ただしそうするのは安全ではないので、より良い方法を使用できます。 フロントエンド:どのような方法ですか? バックエンド:トークンを更新するためのインターフェースを提供し、トークンを定期的に更新します フロントエンド:わかりました。ちょっと考えさせてください。 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 レイアウト チュートリアル: 垂直方向の中央揃えを実現する方法
目次動作原理:ブラウザは何をするのですか?ホストファイル index.htmlメイン.jsその他のベ...
目次ナンセンス文章最初ルーター/index.js 2番目1. プラグインをインストールする2.mai...
jQuery の登場により、DOM の操作効率が大幅に向上し、開発がより高いレベルに引き上げられまし...
目次1. 電流制限アルゴリズム2. nginxの基礎知識4. 実戦要約する高並行性システムには、キャ...
他のよりプロフェッショナルなブログ システムを参照すると、コード ブロックにコードのコピー ボタンが...
序文MySQL クラスターを構築する場合、当然のことながら、データの一貫性を確保するために、データベ...
この記事では、WeChatアプレットの宝くじ番号ジェネレータの具体的なコードを参考までに紹介します。...
/**************************** * システムコール**********...
この記事では、MySQL のマルチテーブル共同クエリ操作について説明します。ご参考までに、詳細は以下...
デフォルトでは、コンテナ内のプロセスは root ユーザー権限で実行され、この root ユーザーは...
このシステムでは、# 記号は root ユーザーを表し、$ 記号は通常のユーザーを表します。では、ど...
目次1. ユーザーとユーザーグループの重要性1) ユーザーの存在意義2) ユーザーグループの重要性2...
目次1. 関数とメソッドの違い2. 良い関数の書き方2.1 正確な命名2.1.1 関数の命名2.1....
目次スムーズなアニメーションの基準方法1: Chromeデベロッパーツールを使用する方法 2: フレ...
JS アニメーションの代わりに CSS アニメーションを使用する必要があるのはなぜですか? Java...