2009-04-29 4 views
2

私はWindowsアプリケーションで作業しています。私はセッションをシミュレートする必要がある(私たちは、Webアプリケーションで)勝利アプリでは、ユーザーが一定期間非アクティブな場合、彼はログオフします。ユーザーのログインステータスは、データベースに保持されます。Windowsアプリケーションでセッションをシミュレートする

革新的なアイデア???

答えて

2

あなたは、セッション(またはCallContext、または何か他のもの)を必要としない、つの制限とちょうどSingleton「ユーザーストア」:

ユーザーがログインまたはいくつかの活性を示した後、あなたは日付を保存する必要があります/それの時間。次回は、ユーザーが何かしたいときは、(lastactivity + logouttime)と実際の日付/時刻を比較するだけです。プロセスの

概要は以下のようになります。

   [User login] 
        | 
        ! 
[User 'store' saves user date + login time] 
[This is a singleton      ] 

        ... 

[Next time user wants to do something. The ] 
[program asks user data from the user 'store'] 
        | 
        ! 
[If the actual time is greater than user  ] 
[lastactivity + LOGOUTTIME, user cannot do it] 
[If not, then update last activity   ] 

USERSTOREが辞書として実装として使用することができます:あなたはいくつかの並べ替えを持って、あなたのアプリケーションでクラスを作成することができ

// Log in 
Singleton.UserStore.Add("John", new UserData(yourUserObject, DateTime.Now)); 

... 

// Check (ie. in a property-get) 
var userData = Singleton.UserStore["John"]; 
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now()) 
{ 
    throw UserAutomaticallyLoggedOut(); 
} 
else 
{ 
    userData.LastActivityDate = DateTime.Now(); 
} 
+0

欠点は、ユーザーが自動的にログアウトされないことです。彼は何かをしてログアウトする必要があります。あなたがマウスとキーボードのイベントを接続し、そのようにしてユーザの活動を監視することを意味するならば、しかし、 'store'がDB内にあれば、不要なDBアクセスが多くなります。タイマーで作業する方がよい。 –

+0

真。しかし私は、ユーザーをチェックしていないことはまれだと思っています。私たちはユーザーの名前で|何かをします。それが本当に必要ならば、タイマーは便利です。 – boj

+1

解決策のもう1つの点は、_LOGOUTTIMEが経過した後もユーザーは常にログアウトされることです。ログイン時間ではなく、_LASTACTIONTIMEを保存して比較する必要があります。しかし、これはおそらくあなたが意味するものです。 –

2

タイマーがゼロになると、BackgroundWorkerを使用してユーザーをログオフすることをお勧めします。このタイマーは、ユーザーが行うすべての操作でリセットされます。または、ユーザーがマウスを動かしていないとき、またはキーボードを使用していないときに、タイマーがログオフ時間に達するまでカウントダウンするように、マウスイベントまたはキーボードイベントにフックすることもできます。

+0

おそらく通常のUIスレッドタイマーを使用するだけで、これにはBackgroundWorkerは必要ありません。 – itowlson

+0

あなたはおそらく正しいでしょう。 :) –

0

ユーザーがソフトウェアと対話するたびにリセットされるタイムアウトタイムアウトに達すると、ユーザーはログアウトされます。

ここで難しいのは、ユーザーの操作を検出することです。 ASP.NETではかなり簡単ですが、本質的にはページリクエストのみをチェックする必要があります。 Windowsフォームアプリケーションでは、より詳細なレベルで入力を処理する必要があります(任意のテキストボックス内の任意のキーを押すと、ユーザーの操作などが可能になります)。私は、KeyPreviewプロパティをKeyPressイベントリスナーと一緒に使うと、良い方法かもしれないと思います。

0

まずは、非アクティブなことはどういう意味ですか? Web上では、存在しない状態をシミュレートしようとしています。しかし、クライアントアプリケーションでは、MouseMoveでもすべてのソートイベントが発生します。 Ondeのアイデアは、TextBox、Buttonなどの標準入力コントロールからUserControlsを作成し、イベントが呼び出されたときに何らかの種類のタイマーオブジェクトを更新できるようにすることです。もう1つは、UserControlの内容を控え、作成する各イベントハンドラのタイマーを更新することです。フォーム自体のMouseMoveイベントまたはKeyDownイベントに基づいてタイマーを更新するほうが簡単でしょう。

関連する問題