2011-11-22 8 views
9

Come è definita la sessione nel bean CDI @SessionScoped?
Questa annotazione è valida solo se richiamata dal contenitore Servlet, dove la sessione è ben definita nella forma di HttpSession?Come funziona @SessionScoped con EJB? Il CDI è solo per il livello Web?

In caso contrario, rispetto a come un EJB con @Inject @SessionScoped MyBean myBean può sapere quale è realmente la sessione? Voglio dire, i metodi di questo EJB potrebbero essere stati invocati da un client standalone, RESTful WS o da qualche altra vista.
Cosa dovrebbe accadere in questo caso? Se l'annotazione non ha alcun significato, dovrebbe iniettare nuova istanza MyBean per ogni richiesta o forse dovrebbe mantenere la stessa istanza su tutte le richieste?

risposta

3

Tratto da @SessionScoped specification

L'ambito sessione è attiva:

durante il metodo di servizio() di qualsiasi servlet nell'applicazione Web, durante il metodo doFilter() di qualsiasi filtro servlet e quando il contenitore chiama qualsiasi HttpSessionListener, AsyncListener o ServletRequestListener.

Quindi in breve, sì. È associato a HttpSession. Inoltre:

Il contesto di sessione è condiviso tra tutte le richieste di servlet che si verificano nella stessa sessione HTTP. Il contesto di sessione viene eliminato quando timeout è HTTPSession, dopo che tutti gli HttpSessionListeners sono stati chiamati e alla fine di ogni richiesta in cui invalidate() è stato chiamato , dopo che tutti i filtri e ServletRequestListeners sono stati chiamati .

+0

In realtà, in quale altro modo viene definita una sessione anche per qualcosa come un SFSB? Naturalmente non c'è nulla che ti impedisca di creare il tuo ambito e legarlo a qualsiasi cosa tu voglia. – LightGuard

+0

@LightGuard, immagino che in SFSB la "sessione" duri dall'istanziazione SFSB alla sua rimozione (o timeout). Quindi finché avrò un riferimento a questo, colpirò lo stesso ambiente (sessione). –

+0

@Gonzalo, grazie per queste informazioni. Mi chiedo: cosa dovrebbe succedere se usassi il bean '@ SessionScoped' in un ambiente in cui non esiste tale ambito (ad esempio REST WS come menzionato in questione). Ogni richiesta viene considerata come una nuova sessione? Che dire di SFSB, come menzionato da LightGuard. Il '@ SessionScoped' si riferirà alla sessione' HttpSession' o alla sessione SFSB? –

Problemi correlati