我正在开发一个Windows应用程序。我需要在win app中模拟Session(我们在web应用程序中),如果用户在一段时间内处于非活动状态,他就会被注销。用户登录状态在数据库中维护。
任何创新的想法???
答案 0 :(得分:2)
我们想到的是当计时器达到零时使用BackgroundWorker注销用户。此计时器将在用户执行的每个操作上重置。或者它甚至可以挂钩鼠标或键盘事件,这样当用户不移动鼠标或不使用键盘时,计时器会倒计时直到达到注销时间。
答案 1 :(得分:2)
您不需要Session(或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可以实现为 Dictionary 并用作:
// 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();
}
答案 2 :(得分:0)
您可以在应用程序中创建一个具有某种超时的类,每次用户与软件交互时都会重置该类。如果达到超时,则用户将被注销。
这里棘手的是检测用户交互。在ASP.NET中非常简单,您基本上只需要检查页面请求。在Windows窗体应用程序中,您需要在更详细的级别上进行montor输入(例如,任何文本框中的任何按键都将是用户交互)。我猜KeyPreview属性和表单上的KeyPress事件监听器可能是一个很好的前进方式。
答案 3 :(得分:0)
嗯,首先,你的意思是什么不活跃?在网络上,你试图模拟没有的状态。但是,在客户端应用程序中,即使是MouseMove也可以获得各种事件。 Onde的想法是,您可以使用TextBox,Button等标准输入控件创建UserControl,并在调用事件时让它们更新某种计时器对象。另一种是放弃UserControl的东西,只更新你创建的每个事件处理程序中的计时器。可能只是根据表单本身上的MouseMove或KeyDown事件更新计时器会更简单。