Frage

Ich arbeite an einer Windows-Anwendung. Ich brauche Session zu simulieren, in dem Gewinn-App (dass wir in einem Web-App haben), wo, wenn der Benutzer inaktiv für bestimmte Zeit ist, er abgemeldet wird. Der Benutzer Login-Status wird in der Datenbank beibehalten.

Jede innovative Ideen ???

War es hilfreich?

Lösung

Sie brauchen nicht Session (oder Callcontext, oder irgendetwas anderes), nur ein Singleton "Benutzerspeicher" mit einer Einschränkung:

Nachdem der Benutzer angemeldet oder eine Aktivität zeigte, müssen Sie das Datum / die Zeit davon speichern. Die nächste Mal, wenn die Benutzer etwas wollen tun, nur vergleichen (lastactivity + logouttime) auf die aktuelle Datum / Zeit.

Gliederung des Prozesses könnte sein:

              [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           ]

Users kann als implementiert werden Wörterbuch und verwendet als:

// 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();
}

Andere Tipps

Was in den Sinn kommt, ist ein Background zu verwenden, um den Benutzer abzumelden, wenn ein Timer Null erreicht. Dieser Timer wird auf jede Aktion zurückgesetzt der Benutzer macht. Oder es könnte sogar zu Maus- oder Tastaturereignis angeschlossen werden, so dass, wenn der Benutzer die Maus nicht bewegt oder nicht über die Tastatur der Timer zählen, bis er die Abmeldezeit erreicht hat.

Sie können eine Klasse in Ihrer Anwendung erstellen, die eine Art von Timeout hat, dass jedes Mal zurückgesetzt wird der Benutzer mit der Software interagiert. Wenn das Zeitlimit erreicht ist, wird der Benutzer abgemeldet.

Die heikele Sache hier ist Interaktion mit dem Benutzer zu erfassen. In ASP.NET recht einfach ist, müssen Sie im Wesentlichen nur für Seitenanforderungen überprüfen. In einer Windows Forms-Anwendung müssen Sie Eingabe auf einer viel detaillierteren Ebene (jeden Tastendruck in jedem Textfeld wird eine Interaktion mit dem Benutzer zum Beispiel sein) Montor. Ich denke, die KeyPreview Eigenschaft zusammen mit einem KeyPress-Ereignis-Listener auf dem Formular könnte nach vorn ein guter Weg sein.

Nun, erstens, was meinst du inaktiv? Auf dem Web versuchen Sie Zustand zu simulieren, wo es keine gibt. Doch in einer Client-Anwendung, erhalten Sie alle möglichen Ereignisse sogar Move. Onde Idee ist, dass Sie Benutzersteuerelemente aus den Standard-Eingabesteuerungen wie TextBox, Knopf schaffen könnten, und so weiter und haben sie irgendeine Art von Timer-Objekt aktualisieren, wenn Ereignisse aufgerufen werden. Das andere ist das Usercontrol Sachen zu verzichten und aktualisieren Sie einfach den Timer in jedem Event-Handler Sie erstellen. Wahrscheinlich wäre es einfacher, nur den Timer zu aktualisieren, basierend auf dem Mousemove oder KeyDown Ereignisse auf dem Formular selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top