管理画面を2画面同時に開けないようにする


お世話になっています。

PHP、Javascriptなどで管理画面だけ同時に2画面開けないようにしたいです。
片方編集画面
片方確認画面
としたとき正常にデータベースに登録されないため

何か良い方法はないでしょうか?

ご教授宜しくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/11/12 17:44:02
  • 終了:2012/11/13 19:34:56
id:oracle11011

補足です。

ログイン画面でIDとPassを入力し
DBのIDとPassが一致すればsessionを立てています。

/**
* ログイン判定
*/
public function isLogin() {
if (is_null($this->Session->read('loginFlg'))) {
$this->redirect(FULL_BASE_URL . INDEX);
}
}

/**
* ログアウト
*/
public function userLogout() {
if (isset($this->request->data['logoutFlg'])) {
$this->Session->delete('loginFlg');
$this->redirect(FULL_BASE_URL . INDEX);
}
}

ベストアンサー

id:TransFreeBSD No.1

TransFreeBSD回答回数668ベストアンサー獲得回数2682012/11/13 19:12:13

ほかの方法もあるかもしれませんが...

管理画面用にセッションIDのようなもの(以下管理セッションID)を生成し、管理画面内では定時間ごとにその管理セッションIDをajaxでクライアントと送受信し続け、その際、管理セッションIDは毎回更新することで、管理画面が一つだけか判断できます。

具体的には、

  • クライアントは保存してある管理セッションIDをサーバに送ります。
    • ただし、そのページでの初回は空文字など初回を表す所定のデータを送ります。
  • サーバはセッション変数に保存してある管理セッションIDとクライアントから送られてきた管理セッションIDが等しいことを確認します。
    • 等しくない場合、そのアクセスは前回の管理画面とは違う管理画面なので重複通知を返します。
    • ただし、空文字など初回を表す所定のデータの場合は重複としません。
  • サーバは新しい管理セッションIDを生成してセッション変数を更新し、クライアントへも送り返します。
    • ただし、空文字など初回を表す所定のデータの場合は更新せず前回と等しい管理セッションIDを送り返します。
  • クライアントは送り返された管理セッションIDを保存し、定時間待ちます。
    • 重複通知が返されている場合は、画面の重複を知らせます。

管理画面がセッションにつき一つである限り重複とは判断されません。
また、ページ更新時、初回のajaxのアクセスだけは重複とはみなされません。
通常のページ遷移であれば、この時点で前回の管理セッションIDが返され、それを変更する画面もないので、次回からも正常に続行されます。
通常のページ遷移ではなく、別画面で開かれた場合、初回のajaxのアクセスだけは重複とはみなされませんが、次回アクセスまでの間に、元の別画面のページでajaxのアクセスが発生し、管理セッションIDが別画面で更新されるため、新しいほうの画面では重複の通知が行われます。

ただ、この方法では別画面を開いてから重複通知までタイムラグが発生します。
これは、ページにあるリンクを、クリックによる通常の画面遷移の場合のアクセスと、別画面を開く場合のアクセスとを、サーバ側で判別できないためです。
そのため、ajaxを用いて、以前のページの表示が継続しているかどうかを検知するためにタイムラグが発生します。
タイムラグのため、次々にテンポよく画面遷移されると重複を検知できません。
重要な決定の場面ではajaxアクセスの一周期間ウエイトして確認する必要があると思います。

以上は1セッション1画面の場合ですが、1ユーザ1画面にする場合、重複ログイン自体を拒否するか、セッション変数ではなく、DB使ってユーザーデータの一つとして1ユーザ1管理セッションIDとして扱ってください。
この場合、同時に有効期限と通常のセッションIDも記録しておけば、別セッションで重複はセッションIDが違うので即時わかります。

ajaxでのチェック間隔はサーバ負荷とタイムラグやウエイトとの兼ね合いになると思います。
あと、管理セッションIDは予測不能である必要はないのでepoch timeとpidとかでよいと思います。

その他の回答(0件)

id:TransFreeBSD No.1

TransFreeBSD回答回数668ベストアンサー獲得回数2682012/11/13 19:12:13ここでベストアンサー

ほかの方法もあるかもしれませんが...

管理画面用にセッションIDのようなもの(以下管理セッションID)を生成し、管理画面内では定時間ごとにその管理セッションIDをajaxでクライアントと送受信し続け、その際、管理セッションIDは毎回更新することで、管理画面が一つだけか判断できます。

具体的には、

  • クライアントは保存してある管理セッションIDをサーバに送ります。
    • ただし、そのページでの初回は空文字など初回を表す所定のデータを送ります。
  • サーバはセッション変数に保存してある管理セッションIDとクライアントから送られてきた管理セッションIDが等しいことを確認します。
    • 等しくない場合、そのアクセスは前回の管理画面とは違う管理画面なので重複通知を返します。
    • ただし、空文字など初回を表す所定のデータの場合は重複としません。
  • サーバは新しい管理セッションIDを生成してセッション変数を更新し、クライアントへも送り返します。
    • ただし、空文字など初回を表す所定のデータの場合は更新せず前回と等しい管理セッションIDを送り返します。
  • クライアントは送り返された管理セッションIDを保存し、定時間待ちます。
    • 重複通知が返されている場合は、画面の重複を知らせます。

管理画面がセッションにつき一つである限り重複とは判断されません。
また、ページ更新時、初回のajaxのアクセスだけは重複とはみなされません。
通常のページ遷移であれば、この時点で前回の管理セッションIDが返され、それを変更する画面もないので、次回からも正常に続行されます。
通常のページ遷移ではなく、別画面で開かれた場合、初回のajaxのアクセスだけは重複とはみなされませんが、次回アクセスまでの間に、元の別画面のページでajaxのアクセスが発生し、管理セッションIDが別画面で更新されるため、新しいほうの画面では重複の通知が行われます。

ただ、この方法では別画面を開いてから重複通知までタイムラグが発生します。
これは、ページにあるリンクを、クリックによる通常の画面遷移の場合のアクセスと、別画面を開く場合のアクセスとを、サーバ側で判別できないためです。
そのため、ajaxを用いて、以前のページの表示が継続しているかどうかを検知するためにタイムラグが発生します。
タイムラグのため、次々にテンポよく画面遷移されると重複を検知できません。
重要な決定の場面ではajaxアクセスの一周期間ウエイトして確認する必要があると思います。

以上は1セッション1画面の場合ですが、1ユーザ1画面にする場合、重複ログイン自体を拒否するか、セッション変数ではなく、DB使ってユーザーデータの一つとして1ユーザ1管理セッションIDとして扱ってください。
この場合、同時に有効期限と通常のセッションIDも記録しておけば、別セッションで重複はセッションIDが違うので即時わかります。

ajaxでのチェック間隔はサーバ負荷とタイムラグやウエイトとの兼ね合いになると思います。
あと、管理セッションIDは予測不能である必要はないのでepoch timeとpidとかでよいと思います。

  • id:TransFreeBSD
    これは別PC別ユーザでもダメにするのか、別ユーザならOKにするのか。というかユーザ管理ありますよね?(なくてもいいけど)
    あと、同時に開けるけど、開いたら前のが無効になる、というのは不可?
    (編集画面から確認画面に行った後、別画面で編集画面に行ったら、もとの確認画面で決定しても戻ってもエラーにする)

    あと、データベース登録時に一方だけ登録ってのも不可?
  • id:oracle11011
    コメント有難う御座います。

    同時に開いたら後から開いたほうをエラーにしたいです。

    ID PASSが1つのユーザーも一人の仕様です。

    別PCならOKで
    同じPC内での2画面をエラーにしたいです。

    宜しくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません