Obyekti necə xəbərdar etmək olar ki, sessiya etibarsızdır və ya başa çatıb?
sobes.tech Süni İntellekt
AI-dan cavab
Java veb tətbiqlərində HTTP sessiyasının etibarsızlaşdırılması və ya tamamlanması barədə obyekti məlumatlandırmaq üçün sessiya dinləyiciləri (Session Listeners), servlet API spesifikasiyası ilə müəyyən edilmişdir.
javax.servlet.http.HttpSessionListener interfeysini həyata keçirən siniflər sessiyanın yaradılması və məhvinə dair bildirişlər alır.
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSession;
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// Sessiyanın yaradılması zamanı logika
HttpSession session = se.getSession();
System.out.println("Sessiya yaradıldı: " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// Sessiyanın məhvi zamanı logika
HttpSession session = se.getSession();
System.out.println("Sessiya məhv edildi: " + session.getId());
// Burada sessiya atributlarını əldə edə və obyektləri məlumatlandıra bilərsiniz
MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");
if (myObject != null) {
myObject.notifySessionInvalidated(); // Objektdəki metodu çağırırıq
}
}
}
Listener-i istifadə etmək üçün onu deployment descriptor-də (web.xml) qeydiyyatdan keçirmək və ya anotasiya (@WebListener) ilə qeyd etmək lazımdır:
web.xml-də qeydiyyat:
<web-app ...>
<listener>
<listener-class>com.example.MySessionListener</listener-class>
</listener>
</web-app>
@WebListener ilə qeydiyyat (Servlet 3.0-dan başlayaraq):
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
// ... sessionCreated və sessionDestroyed metodlarının implementasiyası
}
sessionDestroyed metodunda sessiyada saxlanılan obyektlərə (atributlara) daxil olmaq və onların sessiyanın bitməsini bildirməsi üçün xüsusi metod çağırmaq mümkündür, əgər bu obyektlər bu cür bildirişləri emal etmək üçün dizayn olunublarsa.
Əgər obyekt özünün sessiyanın bitdiyini bilməlidirsə, javax.servlet.http.HttpSessionBindingListener interfeysini həyata keçirə bilər. Bu obyektlər əlavə olunduqda və ya sessiyadan silindikdə bildiriş alırlar.
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class MySessionBoundObject implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Obyekt sessiyaya əlavə olundu
System.out.println("Obyekt sessiyaya əlavə olundu: " + event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Obyekt sessiyadan çıxarıldı və ya sessiya məhv edildi
System.out.println("Obyekt sessiyadan çıxarıldı: " + event.getSession().getId());
// Burada obyektin sessiyanın bitməsini bildirməsi üçün loqika
notifySessionInvalidated(); // daxili metod çağırışı nümunəsi
}
public void notifySessionInvalidated() {
System.out.println("MySessionBoundObject sessiyanın bitməsindən xəbərdar edildi.");
// Bu obyekt üçün sessiyanın bitməsinə dair işləmə loqikası
}
}
MySessionBoundObject obyekt sessiyaya əlavə olunduqda (session.setAttribute("myObjectKey", myObject)), valueBound çağırılır. Sessiya məhv olunduqda və ya atribut silindikdə (session.removeAttribute("myObjectKey")), valueUnbound çağırılır. Beləliklə, valueUnbound obyektə onun əlaqəli sessiyasının bitdiyini bildirmək üçün istifadə oluna bilər.