Is there a way to call a method upon leaving a page with JSF?
Not when using native JSF or PrimeFaces. Your best bet would be to hook on session expiration instead.
import jakarta.inject.Named;
import jakarta.enterprise.context.SessionScoped;
@Named
@SessionScoped
public class Bean implements Serializable {
@PreDestroy
public void destroy() {
// Your code here.
}
}
If you happen to use the JSF utility library OmniFaces, then you can use its @ViewScoped
. This will call the @PreDestroy
when leaving the page referencing the view scoped bean.
import jakarta.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class Bean implements Serializable {
@PreDestroy
public void destroy() {
// Your code here.
}
}
Under the covers, it works by triggering a navigator.sendBeacon()
during the window beforeunload
or pagehide
event with a fallback to synchronous XHR (which is deprecated in modern browsers supporting navigator.sendBeacon()
).