Vue はトークンの有効期限が切れると自動的にログインページにジャンプする機能を実装します

Vue はトークンの有効期限が切れると自動的にログインページにジャンプする機能を実装します

このプロジェクトは最近テストされ、テスターから、トークンの有効期限が切れたため、ルートが自動的にログイン ページにジャンプしてユーザーが再度ログインできるようにするべきであるというバグが報告されました。まず、いくつかの前提条件についてお話しします。

1: 弊社のトークン有効期限は本番環境では1時間に設定されており、トークンの有効期限が切れるとすべてのインターフェースが直接戻ります。
2: ルートがジャンプするたびにトークンが判断されます。グローバルbeforeEachフック関数が設定されます。トークンが存在する場合は必要なページにジャンプし、そうでない場合は

ログインページに直接移動し、ユーザーがログインしてトークンを取得できるようにします。

インターフェースによって返される情報

{
 コード:10009、
 メッセージ: 'トークンの有効期限が切れました',
 データ:null
}

グローバルルーティングフック機能

router.beforeEach(async(to, from, next) => {
//トークンを取得
  // ユーザーがログインしているかどうかを判定する
  定数hasToken = getToken()

  (トークンを持っている場合){
  //トークンが存在する場合、現在のリダイレクトルートがログインインターフェースの場合、if (to.path === '/login') {
      // ログインしている場合はホームページにリダイレクトします
      次へ({ パス: '/' })
      NProgress.done()
    } それ以外 {
    //ここで、ユーザーがこのルートにアクセスする権限を持っているかどうかを判断するために、ユーザーの権限を削除します} catch (error) {
          // トークンを削除し、ログインページに移動して再度ログインします
          store.dispatch('user/resetToken') を待機します。
          Message.error(error || 'エラーあり')
          次へ(`/login?redirect=${to.path}`)
          NProgress.done()
        }
  } それ以外 {
    //トークンが存在しない if (whiteList.indexOf(to.path) !== -1) {
    //リダイレクトするルートがホワイトリストにある場合は、next() にジャンプします
    } それ以外 {
    // それ以外の場合はログインページにジャンプします next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

そこで、すべてのリクエストを直接インターセプトします。応答データがコード 10009 を返すと、ユーザー情報を直接クリアしてページをリロードします。ユーザーがログインすると、トークン、名前、権限情報が store/user.js ファイルに保存され、トークンの有効期限が切れるとユーザー ファイル内の情報が消去されるため、コードを簡略化しました。このように、トークンの有効期限が切れた後、ページが更新されたりコンポーネントにジャンプしたりすると、グローバル beforeEach 判定が呼び出されます。トークン情報が存在しない場合は、ログインページに直接ジャンプします。

'axios' から axios をインポートします
'element-ui' から { MessageBox, Message } をインポートします。
'@/store' からストアをインポートします
'@/utils/auth' から { getToken } をインポートします。

constサービス = axios.create({
  ベースURL: process.env.VUE_APP_BASE_API、 
  タイムアウト: 5000 
})
// リクエスト送信時にトークンを運ぶ service.interceptors.request.use(
  設定 => {
    (store.getters.token)の場合{
      config.headers['sg-token'] = getToken()
    }
    設定を返す
  },
  エラー => {
    コンソール.log(エラー)
    Promise.reject(error) を返します。
  }
)

サービスインターセプターレスポンスの使用(
  レスポンス => {
    コンソールログ(応答データ)
    const res = レスポンス.data

    // トークンの有効期限が切れたので、ログインインターフェースに戻る if (res.code === 10009) {
      store.dispatch('user/logout').then(() => {
        場所を再読み込み(true)
      })
    }
    戻り値
  },
  エラー => {
    console.log('err' + error) // デバッグ用
    メッセージ({
      メッセージ: error.msg、
      タイプ: 'エラー'、
      期間: 5 * 1000
    })
    Promise.reject(error) を返します。
  }
)

デフォルト サービスをエクスポートする

トークンの共有については以上です。プロジェクトに応じて、上記のコードをデータに置き換えてください。

Vue を使ってトークンの有効期限が切れたら自動的にログインページに飛ぶ方法についてはこれで終了です。トークンの有効期限が切れたら自動的にログインページに飛ぶ方法についての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue クリックボタンルートを実装して指定ページにジャンプする方法
  • vueはページにジャンプし、新しいウィンドウを開き、パラメータを渡して受け取ります。
  • Vueジャンプページの4つの一般的な方法と違いのまとめ
  • Vueプロジェクトでページジャンプを実装する方法
  • vuexを使用してページにジャンプする方法
  • Vue ルーティング this.route.push ジャンプ ページが更新されない場合の解決策
  • Vueはこのプロジェクトのページ間のジャンプをどのように実現するのか

<<:  MySQL 8.0 でのチェック制約の実装

>>:  URL 書き換えモジュール 2.1 URL 書き換えモジュールのルール記述

推薦する

CSS を使用して物流の進行状況のスタイルを実装するためのサンプルコード

効果: CSS スタイル: <スタイル タイプ="text/css">...

HTML テーブル マークアップ チュートリアル (18): テーブル ヘッダー

<br />ヘッダーはテーブルの最初の行を参照します。ヘッダー内のテキストは中央揃えで太...

Ubuntu にグラフィック ドライバーが正常にインストールされたかどうかを確認する方法

次のコマンドを実行します: glxinfo | grep レンダリング結果が「はい」の場合、グラフィ...

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...

IE ラベル LI テキスト折り返し問題について

私は長い間この問題に悩まされていましたが、検索してみたところ、実際にこの問題を解決した人がいることが...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...

Podmanはコンテナを自動的に起動し、Dockerと比較します

目次1. podmanの紹介2. Dockerと比較した利点3. 互換性4. バックグラウンド サー...

HTMLのテーブルタグの基本学習チュートリアル

表ラベルの構成HTML 内の表は <table> タグで構成されており、ブラウザはタグを...

Nginx は https ウェブサイト構成コード例を実装します

https ベースポート 443。これはキーと呼ばれるものに使用されます。これらのことを理解せずにで...

Mac での MySQL と Squel Pro の設定

Node.js の人気に応えて、最近、いくつかのサーバー側機能を実装するために Node.js を使...

Nginx で CDN サーバーを構築する方法の詳細な説明 (画像とテキスト)

Nginxのproxy_cacheを使用してキャッシュサーバーを構築する1: ngx_cache_...

MySQL で複数のフィールドを連結する詳細な例

MySQL クエリ結果の行フィールドの結合は、次の 2 つの関数を使用して実装できます。 1. co...

標準的なHTMLの書き方は、Dreamweaverによって自動的に生成されるものとは異なります。

コードをコピーコードは次のとおりです。 <!--doctype はドキュメント タイプ htm...

テーブルを開く際のMySQLスレッドの問題の解決方法

問題の説明最近、MySQL5.6.21サーバーがありました。アプリケーションがリリースされた後、同時...

フローティング要素が親要素の高さを崩す原因と解決策の詳細な説明

フローティング要素は、親要素の高さを縮小します。要素を float float:left/right...