序文: 最近、ログイン フロントエンド:バックエンド、トークンの有効期限を長く設定できますか? バックエンド:はい、ただしそうするのは安全ではないので、より良い方法を使用できます。 フロントエンド:どのような方法ですか? バックエンド:トークンを更新するためのインターフェースを提供し、トークンを定期的に更新します フロントエンド:わかりました。ちょっと考えさせてください。 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 レイアウト チュートリアル: 垂直方向の中央揃えを実現する方法
前回は、JavaScript の charAt() メソッドの使い方を紹介しました。今日は、最も多く...
<label> タグは、入力要素のラベル (タグ) を定義します。ラベル要素はユーザーに...
自宅のルーターが300Mの帯域幅を80Mに強制的に減らしたため、3205Uソフトルーターを購入しまし...
目次序文アドバンテージ:欠点: 1. レスポンシブな使用効果2. ステータスが同期されていないRea...
Navicat クライアントを通じてデフォルトの日時値を変更する際に問題が発生しました。データベース...
ブラウザはおそらく私たちにとって最も馴染みのあるツールです。 Firefox、Opera、Safar...
かつて、サイコロを振るゲームについて話しました。その時は、steps 属性 + スプライト画像を使用...
1: Dockerプライベートウェアハウスのインストール1. イメージリポジトリからイメージをダウン...
序文Boost ライブラリは、標準ライブラリのバックアップとして機能し、C++ 標準化プロセスの開発...
今日は、ローカルの Docker プロジェクト イメージを dockerhub に公開する方法を紹介...
目次1. 成果を達成する2. バックエンドの実装2.1 エンティティクラス2.2 データベース内のデ...
High Performance MySQL バージョン 3 (セクション 4.1.7) を見ると、...
最近、カンファレンスの健康申告システムに取り組んでいたとき、バックエンドを構築する必要があり、vue...
目次1. css() の基本的な使用法: 1.1 CSSプロパティを取得する1.2 CSSプロパティ...
序文:データベースのバックアップの重要性は、特にデータの損失が深刻な結果を招く可能性がある実稼働環境...