Avoid multiple session per-user

Merhaba arkadaslar,

Bu ufak yazıda web application’lar içerisinde karşılaşabileceğiniz bir durumu aktarmaya çalışacağım.

Sorun: Aynı username/password ile farklı tarayıcı/ortam üzerinden login olmaya çalışmak.

Çözümümüz ise öncelikle login olan kullanıcıyı bir yerde tutuyor olmamız lazım. Bu session vb bir yer de olabilir, core java içinde bir yerde olabilir. Core Java ile halledecegiz biz.

Öncelikle login olacak user’ı handle edecek user manager yazalım;

UserSessionManager.java

Basit bir Java classı yukarıdaki. Singleton pattern’ı barındırıyor, username – session ikilisini bir map’de tutuyoruz.

UserManager’ı efektik olarak kullanabilmek için bir listener ve bir filter kullanacağız.

LifeCycleListener.java

Listener ile birlikte context’imize user session manager ekliyoruz.

Şimdi ise bir filter tanımı yapacagız, pattern’ı /* şeklinde tüm url’leri kapsayacak şekilde ayarlayacağız.

LoginFilter.java

Filter’ımızda /* tüm url’leri handle ediyoruz. Eğer kullanıcı login oldu ise User Principial null gelmeyecektir artık. Login olan kullanıcının adını alarak ilk önce session manager’ımızda böyle bir user var mı diye bakıyoruz. Var ise old session invalide ediliyor. Yok ise username-session olarak session manager’a eklemiş oluyoruz. Son olarak da isteği filter.doFilter(req, res) ile gittiği url’e gönderiyoruz.

 

Test;

Bir web app oldugu için servlet contaıner olarak Tomcat kullandım. Authanticatonu file based yapabilirsiniz. tomcat-user.xml’de admin/admin kullanıcı oluşturalım. İki farklı browserdan login olmaya çalışalım. İkisi ile de login olabileceğiz burada sorun yok. Ancak aktif olarak son login olan uygulamanın içerisinde kalabiliyor olacak. Yani old session invalidate olduğu için otomatik olarak login page’e yönlendirilecektir.

Örnek uygulamaya github’dan erisebilirsiniz : https://github.com/AlicanAkkus/UserSessionManagement

Yazıyı burada sonlandırıyoruz arkadaslar, mutlu ve esen kalın. Hayırlı Ramazanlar.

~ A.Akkus

613 Total Views 3 Views Today