Monday, December 3, 2007

Implementing session timeout in swing apps

If you are working in a web based project, the term "session" must be a frequently used one. "I want to implement a HttpSessionListener", "How do I access http session?", "Should i store my user state in http session or in a session bean?".

But I just wondered, how to implement that in a swing application? (Sorry, i haven't learn swing application framework yet)

Consider this typical scenario:
A user has logged into the swing application and has opened some 2 or three windows (JFrames). Now the user goes somewhere leaving the system idle.
How can we logout the user automatically here (for security reasons)?
How to close the opened resources?

I initially thought of writing a global event listener and implementing that in all the user interface classes. But that looked like a bad idea for me, because that would involve a lot of code changes.

So I searched through the net and found out a solution from a java forum (thanks camickr).
In contrast to my expectations, it was quite simple though. And here it is:

private void trackSystemEvents()
{
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
{
public void eventDispatched(AWTEvent event)
{
String eventText = event.toString();
if(eventText.indexOf("PRESSED") != -1 || eventText.indexOf("RELEASED") != -1)
{
SessionMonitor.getInstance().setLastActionTime(System.currentTimeMillis());
}
}
}, AWTEvent.MOUSE_EVENT_MASK + AWTEvent.KEY_EVENT_MASK);
}

Here, i want to track the user activity through a "global" listener kind of thing. And here the event listener is registered with AWTEvent.MOUSE_EVENT_MASK and AWTEvent.KEY_EVENT_MASK. That means, only mouse events and key events shall be tracked.

And i don't want to track the mouse moved/entered events and that's why the small "if" condition which checks only for "pressed/released" actions like key pressed, mouse released etc.

This will help you in implementing the logic to track session timeout.

And spice it up with "observer" pattern to notify your user interfaces to close the opened resources.

2 comments:

Jetlag said...

thanks this helped alot i am writing a kiosk program and when theres no activity for a while i can now return to the main menu.

yonkul said...

www.turksohbetim.net