序文: 最近、ログイン フロントエンド:バックエンド、トークンの有効期限を長く設定できますか? バックエンド:はい、ただしそうするのは安全ではないので、より良い方法を使用できます。 フロントエンド:どのような方法ですか? バックエンド:トークンを更新するためのインターフェースを提供し、トークンを定期的に更新します フロントエンド:わかりました。ちょっと考えさせてください。 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 レイアウト チュートリアル: 垂直方向の中央揃えを実現する方法
操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...
データクリーニング (ETL)コアビジネスの MapReduce プログラムを実行する前に、まずデー...
目次01 アトミックDDLの紹介02 一部のDDL操作の実行動作の変更03 DDL 操作のログを表示...
複雑な表を作成するには HTML を使用します。複雑なテーブルでは通常、td の rowspan 属...
この記事では、参考までに、シンプルなナビゲーションバーを実装するためのJavascriptの具体的な...
これは主に CSS スタイルのコントロールと META タグです。コードをコピーコードは次のとおりで...
Nginx によるソケット ポート転送の一般的なシナリオ: オンライン学習アプリケーションでは、通常...
win10 + Ubuntu 20.04 LTS デュアルシステムインストール (UEFI + GP...
1. 従来のbinlogマスタースレーブレプリケーション、エラー報告をスキップする方法 mysql&...
最近、モバイル プロジェクトの開発方法を学ぶために vue を使用し、スクロールには better-...
1. 呼び出しを実装するステップ:関数をオブジェクトのプロパティとして設定します。これを関数に割り当...
この記事では、WeChatアプレットで写真を撮ったり、アルバムから写真を選択したりするための具体的な...
目次OAuth アプリの作成コードを取得するaccess_tokenを取得するユーザー情報を取得する...
この記事では、JavaScriptで簡単なGobangゲームを実装するための具体的なコードを参考まで...
背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...