我正在开发一个Windows应用程序。我需要在win app中模拟Session(我们在web应用程序中),如果用户在一段时间内处于非活动状态,他就会被注销。用户登录状态在数据库中维护。

任何创新的想法???

有帮助吗?

解决方案

您不需要会话(或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();
}

其他提示

我们想到的是当计时器达到零时使用BackgroundWorker注销用户。此计时器将在用户执行的每个操作上重置。或者它甚至可以挂钩鼠标或键盘事件,这样当用户不移动鼠标或不使用键盘时,计时器会倒计时直到达到注销时间。

您可以在应用程序中创建一个具有某种超时的类,每次用户与软件交互时都会重置该类。如果达到超时,则用户将被注销。

这里棘手的是检测用户交互。在ASP.NET中非常简单,您基本上只需要检查页面请求。在Windows窗体应用程序中,您需要在更详细的级别上进行montor输入(例如,任何文本框中的任何按键都将是用户交互)。我猜KeyPreview属性和表单上的KeyPress事件监听器可能是一个很好的前进方式。

嗯,首先,你的意思是什么不活跃?在网络上,你试图模拟没有的状态。但是,在客户端应用程序中,即使是MouseMove也可以获得各种事件。 Onde的想法是,您可以使用TextBox,Button等标准输入控件创建UserControl,并在调用事件时让它们更新某种计时器对象。另一种是放弃UserControl的东西,只更新你创建的每个事件处理程序中的计时器。可能只是根据表单本身上的MouseMove或KeyDown事件更新计时器会更简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top