Onunla ilişkili 0 veya daha fazla geçerli HttpSession
nesnesi olan, Java tabanlı bir web uygulamasına sahip olduğumu varsayalım. Geçerli geçerli HttpSession
nesnelerine erişmek için bir yol istiyorum. Bir HttpSessionListener
uygulayabileceğimi düşünüyordum ve bunu uygulama kapsamlı bir öznitelikte saklanan oturum kimliği değerlerinin listesine eklemek için kullanıyorum, ancak oturumları geçersiz kılan ve kim bilir diye listeyi güncellemek için kancadayım. başka.
servlet API olmayan geçersiz bir oturum nesnelerin tam listesi erişim alma bazı araçlar sağlıyor mu:Bir web uygulamasındaki tüm HttpSession nesnelerinin bir listesini nasıl alabilirim?
benim kendi çözüm pişirme başlamadan önce ben soru sormak gerektiğini düşündüm?
benim web uygulama kapsayıcı olarak Tomcat 6.x kullanıyorum ve MyFaces 1.2.x (JSF) kütüphanesi.
- How to easily implement "who is online" in Grails or Java Application ?
- JSF: How to invalidate an user session when he logs twice with the same credentials
Ben HttpSessionBindingListener
uygulamak için SessionData
sınıfı tarafından değiştirilme:
ÇÖZÜM ben bu mevcut sorulara tartışılan BalusC ne benzer bir yaklaşım izledi. Bir bağlama olayı gerçekleştiğinde, nesne kendisini SessionData
nesnesinin tümünün kümesinden ekler veya kaldırır. beni kızdırmaya devam ediyor
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Get my custom application-scoped attribute
ApplicationData applicationData = getApplicationData();
// Get the set of all SessionData objects and add myself to it
Set<SessionData> activeSessions = applicationData.getActiveSessions();
if (!activeSessions.contains(this)) {
activeSessions.add(this);
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ApplicationData applicationData = getApplicationData();
Set<SessionData> activeSessions = applicationData.getActiveSessions();
if (activeSessions.contains(this)) {
activeSessions.remove(this);
}
}
bir şey Tomcat yeniden başlatıldığında bu olur. Tomcat, oturumları diske serileştirmek için uygun şekilde yapılandırılmadıkça, bunu yapar. Tomcat yeniden başlatıldığında, HttpSession
nesnesi (ve bunlarla birlikte SessionData
nesnesi) serileştirilir ve oturumlar tekrar geçerli olur. Ancak, serileştirme/serileştirme, HttpSession
dinleyici olaylarını tamamen tersine çevirir; bu nedenle, yeniden başlatıldıktan sonra yönetilen nesne kümemde SessionData
ürününe serpiştirilmiş referansı yeniden zarifçe koyma fırsatına sahip değilim.
Müşterimin organizasyonunda Tomcat üretim yapılandırması üzerinde herhangi bir kontrol yok, bu yüzden bunu beklediğiniz gibi yapılacaktır kabul edemeyiz.
Benim geçici çözüm bir istek alındığında uygulama başlatma süresiyle ilgili HttpSession
oluşturma süresini karşılaştırmaktır. Oturum, uygulama başlatma saatinden önce oluşturulduysa, invalidate()
numaralı telefonu arayın ve kullanıcı, ne olduğu hakkında bir açıklama içeren bir hata/uyarı sayfasına gönderilir.
Uygulamanın başlangıç saatini bir ServletContextListener
uygulayarak ve geçerli süreyi uygulama kapsamlı bir nesnenin içinde, dinleyicimin contextInitialized()
yöntemini kullanarak saklıyorum.
başvurum olacak Özel bir ağda sınırlı sayıda kullanıcı var, bu yüzden dağıtılmış dağıtımı desteklemem gerekmeyecek. Yine de yorumunuza katılıyorum. –
Sanırım bunu düzeltmenin yolunun (disk üzerinde kalıcılığın yanı sıra) dinleyicinin oturumları takip eden bir paylaşımlı veri deposunu (Redis, Memcached veya başka bir şey) güncellemesi gerekir. – Thilo