2015-05-10 37 views
0

我對Java EE相當新穎。我正在瀏覽CDI和EJB材料,並且遇到了@SessionScoped和@Stateful註釋。@SessionScoped/@Stateful - 他們如何管理會話/狀態

查看定義: @SessionScope:維護用戶與跨多個HTTP請求的Web應用程序的交互。

@Statfeful:看起來像它具有相同的功能@SessionScope

因此,這裏有我的疑惑:

1)不要兩者達到同樣的目的? 2)我有一些Node和Python的經驗。在那些用於維護客戶端狀態的語言中,我總是使用與HTTPSession對象綁定的cookie,該對象進一步綁定到內存緩存(redis/memcache),以便在所有服務器上分發。

所以我可以在這裏使用相同的技術以及...正確嗎?那我爲什麼要用這些符號呢?另外,如果我打算使用它們,那麼如何讓它們分佈在所有服務器上? 我的意思是來自客戶端的請求可以來到server1,然後下一個請求可以去server2 ..在這種情況下,如果這個SesssionScoped對象沒有分佈,那麼事情將如何正確工作?

這些註釋的目的是什麼?

回答

0

不,它們不是一樣的,但它們可以一起使用。

@SessionScoped將對象綁定到HTTP會話。 Session Bean僅僅意味着它們的狀態可以維護在來自單個調用者的調用之上。有狀態會話Bean來自沉重的客戶端應用程序,其中Java SE程序可能會在遠程服務器上查找EJB來完成工作。這些類型的客戶機/服務器應用程序可能使用有狀態EJB來維持服務器上的一定數量的會話狀態,而不需要HTTP(它們在應用程序服務器上使用RMI-IIOP,CORBA等協議)。

現在,您可以繼續使用有狀態會話Bean和HTTP會話。

+0

@sessionScope將對象綁定到HTTP會話......您能解釋一下嗎?如果我的sessionScoped對象沒有分配,那麼這將如何工作?這個綁定是如何完成的?在此之前,我使用cookie將我的http請求綁定到http會話對象(在node.js中) – JackSparrow

+0

我的意思是任何意圖保持客戶端狀態的對象都必須分佈在所有應用服務器上,不是嗎? – JackSparrow

+0

你是什麼意思沒有分配?我認爲你混淆了集羣和http會話。 –

0

在和我的隊友說了一句話之後,我想我的問題有一個可能的答案。

在粘性會話的情況下,可以利用sessionScope或stateful。 Sticky and NON-Sticky sessions

在這種情況下,用戶會話僅粘在一個盒子上,不分佈在所有盒子上。但是,如果我們不使用粘性會話,這些註釋幾乎是無用的