まず、vuejs 2.0とwebpack、vue-router(履歴モード-SPAサイト)、およびホットモジュールをロードするwebpackdevサーバーで実行されているvuexを使用しています。
コンポーネントにマップされた約10のルートがあります。サイトは正常に機能していますが、トークンベースの認証を追加しています。 router.beforeEachを使用してトークンチェックを実行しています。トークンが有効な場合は、トークンを通過させる必要があります。トークンが無効な場合は、トークンを/ loginページにリダイレクトする必要があります。問題は、チェックを実行し、最初に制限することです。しかし、2回目の試行では、ページに移動してコンテンツを表示できます。 1秒おきのリクエストはルートを適切に処理し、/ loginにリダイレクトするようです。私のcheckToken()関数は、テスト目的で常にfalseを返します。
コード:
// Configure Router
const router = new Router({
routes, //routes are configured elsewhere, they work fine so not needed
mode: 'history'
})
router.beforeEach((to, from, next) => {
if(to.path != '/login') {
if(checkToken()) {
logger('There is a token, resume. (' + to.path + ')');
next();
} else {
logger('There is no token, redirect to login. (' + to.path + ')');
next('login');
// next('/login');
// router.Push('login');
}
} else {
logger('You\'re on the login page');
}
next();
});
function checkToken() {
return false;
}
メインページ( "/")に移動すると、期待どおりに/ loginにリダイレクトされます。私のコンソールには、次の2つのエントリがあります。
[14:36:30.399]:トークンがありません。ログインにリダイレクトしてください。 (/)[14:36:30.399]:ログインページを表示しています
良さそうです。 「/」を読み込もうとしましたが、トークンがないことがわかり、/ loginにリダイレクトされました。ここで、チェックはログインページにいることを確認して停止します。
次に、Projectsリンクをクリックして、/ projectに移動します。コンソール出力:
[14:40:21.322]:トークンがありません。ログインにリダイレクトしてください。 (/事業)
完璧ですが、loginページではなく、projectsページが実際に表示されています。
次に、Sitesリンクをクリックして/ siteに移動します。コンソール出力:
[14:41:50.790]:トークンがありません。ログインにリダイレクトしてください。 (/ site)[14:41:50.792]:ログインページを表示しています
見栄えがよく、ブラウザにsiteページが表示されています。これはまさに私が見たいものです。
次に、Requestsリンクをクリックして/ requestにリンクします。コンソール出力:
[14:44:13.114]:トークンがありません。ログインにリダイレクトしてください。 (/リクエスト)
しかし、繰り返しになりますが、リダイレクトはしていません。 loginページが表示されるはずなのに、requestページが表示されます。
今回は、Projectsリンク(/ project)をもう一度クリックすると、projectページではなくprojectページが誤って表示されていました。 login)==ページ。コンソール出力:
[14:47:12.799]:トークンがありません。ログインにリダイレクトしてください。 (/ project)[14:47:12.800]:ログインページが表示されています
今回は、必要に応じて/ loginページにリダイレクトしました。
クリックした順序やリンクに関係なく、適切にリダイレクトされるのは、文字通り、クリックした他のすべてのリンクです。 1つ目はリダイレクト、2つ目はリダイレクトしない、3つ目はリダイレクトする、4つ目はリダイレクトしない、5つ目はリダイレクトするなど...
Next( '/ login')、next( 'login')、router.Push( 'login')を試しましたが、すべて同じ結果になりました。いつリダイレクトするかはわかりますが、リダイレクトは1回おきにしか機能しません。
完全なリクエスト(ページの更新、アドレスの入力、Enterキーの押し)を実行すると、計画どおりに常に/ loginにリダイレクトされますが、SPAでこれを実行しようとしています。私が欠けているものはありますか?
修繕。私の側の監視。
これはルーターコードがどうあるべきかです:
_router.beforeEach((to, from, next) => {
if(to.path != '/login') {
if(checkToken()) {
logger('There is a token, resume. (' + to.path + ')');
next();
} else {
logger('There is no token, redirect to login. (' + to.path + ')');
next('login');
}
} else {
logger('You\'re on the login page');
next(); // This is where it should have been
}
// next(); - This is in the wrong place
});
_
簡単な答えで愚かな問題、私は私のnext()
を間違った場所に置いていたので、それは常に最後にそれを処理していました。しかし、なぜそれが正しくリダイレクトされたのか、私はまだ興味があります。