2010-09-22 37 views
48

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.

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.

cevap

9

hiçbir yalındır yolu yoktur. Dağıtımlara bağlı. Dağıtılmış dağıtım ve yük dengelemeyi kullanmaya karar verdiğinizde, başarısız olur.

+1

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. –

+0

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

İlgili konular