正当化と研究
表示するためにユーザーがログインする必要があるサイトがあります。ユーザーがログインしている間、ユーザー セッションを監視したいと思います。つまり、ユーザー セッションの有効期限が切れているかどうかを知りたいので、リダイレクトします。
各ユーザーのセッションは 1 時間 (または私が設定した時間) 続き、別のページにアクセスするとリセットされます (ほとんどのログイン システムと同様)。
現在、次のアルゴリズムがあります。
- ユーザーが非公開ページに到達する (呼び出された javascript メソッド
isUserAuthorized()
が実行される) isUserAuthorized()
JavaScript メソッドは、ページ 'ajax.example.net/authorized' に対して AJAX 要求を行います。- このページは、次のようなユーザーの現在のステータスを示す JSON オブジェクトを返します。
{ authorized: true, timeout: 3600000 }
- 次に、javascript メソッドは
timeout
、セッションが終了したと仮定して、タイムアウトをミリ秒単位で再度メソッドを呼び出すように設定します。 - セッションが終了した場合はユーザーをリダイレクトし、それ以外の場合は
timeout
ミリ秒単位でメソッドを呼び出します。
この現在の方法が気に入らない理由は 2 つあります。
- クライアントとサーバーのクロック間の時刻同期に問題がありました。これは奇妙ですが、間違いなく問題を引き起こします...
- Web ページのバックグラウンドでタイムアウトが発生します。このサイトは JavaScript が非常に多いため、サイトをできるだけスムーズに保つために、この追加のタイムアウトを設定したくありません。
私の質問
したがって、私の質問は、これを達成するためのより良い方法を考えられる人はいますか? 私は長いポーリングまたは Websocket について考えましたが、これらの使用方法を 100% 確信しているわけではなく、Websocket のチュートリアルはあまり良くありません! これらは実際にはより良い解決策でしょうか?
時刻同期の問題を回避できますが、その前に、これを達成するためのより良い方法がないことを確認したいと思います...
それが役立つ場合、これが私の現在のコードです:
// Set the Authorized Timeout
MN.authorizedTimeout = setTimeout(function(){MN.isUserAuthorized});
/**
* Is User Authorized
* Checks to see if the current user is authorized and
* makes sure their session is still active
*/
MN.isUserAuthorized = isUserAuthorized;
function isUserAuthorized(){
// TEMPORARY
console.log('authorising');
// Set the authorized var
var authorized = false;
// Clear the current timeout
clearTimeout(MN.authorizedTimeout);
// Send request to determine whether the user is authorized
$.ajax({
url: "//ajax.example.net/authorized",
type: "GET",
dataType: "JSON",
cache: false,
async: false,
success: function(data){
console.log(data);
if(data.authorized){
// If the user is authorized then check again in timeout milliseconds
MN.authorizedTimeout = setTimeout(MN.isUserAuthorized,data.timeout_milliseconds);
// Set authorized to true
authorized = true;
}else{
// If the session has expired then proceed to informing the user
MN.userSessionExpired();
// Set authorized to false
authorized = false;
}
}
});
// Return the session status boolean
return authorized;
}