2009-06-21 20 views
0

は私が次の詳細につきとしてログイン用のユーザーを制限する必要がするシナリオがあります:500番目のユーザーが私のウェブサイトにログインしようとするたびにログインを制限するにはどうすればいいですか?

「ユーザのログインを超えるメッセージがあるだろうが、後からログインしてください! "

一度にログインできるユーザーは499人、500番目のユーザーは管理者です。また、管理者のページビューでオンラインユーザーを表示する必要があります。だから、どのようにログインユーザーを計算し、500

件までの数字を制限することは、それらが格納されているので、あなたがセッションの動作を変更することでこれを行うだろうPHPでaps.net C#

+1

ここではglobal.asaxをタグとして使用しているので、おそらくSession_StartとSession_Endについて知っていると思いますが、何が問題なのですか?これらのイベントを使用して実装するのは難しくありません。いくつか詳細を教えてください。 – Kobi

+0

しかし、ユーザーがブラウザを閉じるたびにSession_Endイベントが発生しません。 –

+0

セッションがタイムアウトした後にSession_Endが起動しませんでしたか?これは必要に応じて数分に設定することができ、デフォルトは20分です。あなたはまだユーザーの数を取得し、それらを追跡することができます。 – Kobi

答えて

0

に関連する答えを提供してくださいDBに。そうすれば、ログオンしている人の数を大まかに把握できます。

私はASPでこれを行う方法があると仮定しています。

0

優れたRDBMS(と良好なネットワーキング)をお持ちの場合は、その情報をテーブルに登録することができます...しかし、これは高価な場合は、サーバー側の技術(セッション、アプリケーションなど) )。

JSではできません。その情報(カウンター変数)はどこに保管しましたか?

クライアントがサーバーに接続するたびに、すべてのJSコードがリロードされ、その情報を格納する方法がありません。

また、Cookieを使用する場合は、Cookieが使用されているクライアントに固有のものであることを覚えておいてください。

0

これを達成する方法は複数あります。

DB内のセッションは一方向です。あなたのサイトに何人の匿名ユーザーがいるかを知るために使用することもできます。

あなたが探しているタスクを達成するもう1つの方法は、ユーザーテーブルのユーザーに、「logged_in」という新しいフィールドでフラグを立てることです。

loginメソッドが実行されると、フラグはlogoutメソッドと同様にそれに応じて変更されます。次に、ユーザーがログインして現在ログインしている人の数を確認し、それに応じて行動しようとするたびにSELECTクエリを実行します。

「ログイン」または「ログアウト」メソッドが実行されたことに応じて、ログインしたユーザーの合計数、加算および減算の数をDBにカウントする方がよい場合があります。この方法では、特定のユーザーが特定の時点でログインしているかどうかを知ることはできませんが、少なくとも必要なものは全体の番号になります。この方法は、ユーザーテーブル全体でSELECTクエリを実行する必要がないため、DBから特定のフィールドの値を取得してパフォーマンスを向上させることができるため、より優れています。残念なことに、毎回ログアウトしないと、ログイン時間を保存して一定時間後にログアウトしない限り、この方法は役に立ちません。

ユーザーがブラウザを閉じて「ログアウトしない」という問題を解決するには、上記で提案したDB構造の組み合わせで、とにかくセッションを保存することをおすすめします。

+0

匿名ユーザーは数えられません。また、ユーザーがログアウト・リンクを叩くことなくブラウザを閉じるシナリオでは何がありますか。そのユーザーをどのように考えるか? –

+0

匿名ユーザーはカウントできません。あなたは匿名のショッピングカートがどうやって動くかをどう思いますか? – Sev

+0

私は自分の投稿を編集して、ログアウトせずにブラウザを閉じるユーザを扱う方法を含めました。 – Sev

0

asp.netには、global.asaxというファイルを追加できます。このファイルには、Session_StartSession_Endを含むアプリケーションレベルのイベントがあります。これにより、データベースを使用しているかどうかにかかわらず、セッションを簡単に追跡できます。

0

データベースに現在ログインしているユーザーを追跡する必要があります。 Sevは、それを達成するための良いアイデアを提供します。しかし、彼の答えに対するコメントでも言及されているように、ログアウトせずにWebページを閉じるだけのユーザーが多いため、ログアウトボタンをクリックするとログアウトしたユーザーにマークすることはできません。

したがって、セッションを自動的にエクスポーズするセッション管理が必要です。そうしないと、数秒間のユーザーの非アクティブが発生します。

私のオンラインバンキングソフトウェアでは、これはamazon.comで90秒または120秒(より高いセキュリティ)のようなものですが、少なくとも数時間(より良いcustomerexperience)です。このタイムアウトをどれくらい長く設定するかは、アプリケーションの厳しい要件に依存します。

とにかく、これはかなり一般的な問題ですので、すでにこれを実装しているいくつかのフレームワークがあるはずです。

2

これはアプリケーションのコンテキスト処理に適していると思います。

MS SQLでこれらのものを保存しないでください。無駄なリソースがデータベースに接続するためです。

最も簡単な方法は、オンラインユーザーの数に関するデータを保持するためにシングルトンオブジェクトを作成することです。このオブジェクトは、Application_Startイベントでインスタンス化することができます。

ログインアクションが発生するたびに、オブジェクトをロックし、現在のユーザーカウントを累積してロックを解除します。

関連する問題