web-dev-qa-db-ja.com

ページでのユーザーアクティビティに関するセッションタイムアウトの管理

ですから、phpアプリケーションに次の機能を作成します。

  • 30分後に期限切れになるセッションを作成します。
  • 30分後、アプリケーションにユーザーアクティビティがない場合(テキストボックスへの入力、ページ全体でのマウスの移動など)、セッションは破棄され、システムはログアウトページ(logout.php)にリダイレクトされます。キーボード/マウスが意味するのは、システムに固有のことだけです。システムの外部で他のことをしているときにシステムが開いている場合、システムはアイドルと見なす必要があります。
  • セッションに残り時間(15秒など)があり、ユーザーアクティビティがある場合、セッションの寿命はさらに30分延長されます。これは、ユーザーが重要な情報を入力する場合、フォームを送信する直前にログアウトするのは非常に不便であるためです。これが、キーボードとマウスの動きをシステムが検出する必要がある理由です。

私は2つの可能な解決策を考え出しましたが、それらに満足していません。

最初の解決策

ほとんどすべてにJavaScriptを使用します。

  • セッションまたはCookieを管理します(JavaScriptがサーバー側セッションを認識するかどうかは本当にわかりません)
  • キーボード/マウスアクティビティを検出する
  • セッション/ Cookieの寿命を延ばす
  • セッションを破棄するには、logout.phpにリダイレクトします

この解決策は非常に悪いと思います。 JavaScriptコードを操作して変更する方法があると思います(たとえば、logout.phpへのリダイレクトを防ぐため)。つまり、サーバーで実行する必要があるプロセスを実行しています。

第二の解決策

  • 以前と同様に、JavaScriptを使用してキーボード/マウスのアクティビティを検出します。
  • 30分15秒前に、phpページにajaxリクエストを送信する必要があります。 ajaxリクエストには、この間にユーザーアクティビティがあったかどうかの情報が含まれています。
  • この特定のphpページは、ajaxによって送信された情報を管理します。ユーザーアクティビティが検出された場合、phpはセッションの寿命を延ばします。それ以外の場合は、ajaxの.done関数または他の手段のいずれかを介してlogout.phpにリダイレクトする必要があります。

上記で説明したプロセスは良い解決策ではないと思います。具体的には、サーバー側の処理を行うためのJavaScriptの多用。私の問題は、phpを使用してキーボード/マウスの動きを検出する方法が見つからないことです。これを行う方法に関して私が見つけたものはすべて、JavaScriptを使用することです(当然、ユーザーのアクションはサーバーではなくブラウザで行われるため)。

どうすればいいですか?最良かつ最も安全なソリューションは何でしょうか?

3
morbidCode

2番目のソリューションは、最良のソリューションです。これは、サーバーがアクティブであることをサーバーに通知するのは基本的にクライアントの責任であるべきだからです。その後、サーバーは必要に応じてそこから実行できます。

これにより、サーバーは何が起きるかをすべて制御できます。クライアントが持つ唯一の制御は、ユーザーがまだアクティブかどうかを指定することです。これは適切なクライアント/サーバー関係です。

4

唯一の解決策としてJavaScriptに依存しないでください。 PHPは、ページの更新を処理するJavaScriptクラスでセッションの有効期限を追跡する必要があります。JSからの更新がない場合、PHP次のリクエストで自動的に。コンピューターのスリープ、ネットワークの切断、ブラウザーでJavaScriptが無効になっているまれなケースなど、JSがページを更新しない理由はたくさんあります。

AJAXの呼び出しは、キープアライブリクエストのようなものにすぎず、応答はOKまたは「どのセッション?」のいずれかになります。

ソリューション#1の場合、ユーザーのすべてのアクションに対してサーバーにpingを送信するのではなく、そのルートをたどると、アクティビティをまとめて3〜5分おきにのみpingを送信します(最後の3〜 5分)。

選択する解決策が何であれ、ユーザーが複数のブラウザウィンドウ/タブを開いている可能性があるという事実を処理することと、あるウィンドウからAJAXがセッションをクリアしないようにする必要があります。そのウィンドウでのアクティビティはありません。

3
Phil M