2011-12-12 34 views
15

यह मेरा पहला प्रश्न है और मुझे उम्मीद है कि मैं इसे सही कर रहा हूं।उपयोगकर्ता के सत्र को ट्रैक करने के लिए एक स्टेटस सत्र बीन का उपयोग करना

मुझे जावा ईई प्रोजेक्ट पर काम करने की ज़रूरत है, इसलिए, शुरू करने से पहले, मैं कुछ सरल करने की कोशिश कर रहा हूं और देख सकता हूं कि मैं ऐसा कर सकता हूं या नहीं।

मैं स्टेटस सत्र बीन्स के साथ अटक गया हूं। मैं एक SFSB का उपयोग कैसे एक उपयोगकर्ता के सत्र ट्रैक करने के लिए कर सकते हैं :

यहाँ सवाल है? मैंने जो भी उदाहरण देखा, SFSB को HttpSession विशेषता में "डालने" में समाप्त हुआ। लेकिन मुझे समझ में नहीं आता क्यों! मेरा मतलब है, यदि बीन STATEFUL है, तो मुझे इसे रखने के लिए HttpSession का उपयोग क्यों करना है?

एक EJB कंटेनर के ग्राहक के लिए सही SFSB वापस जाने के लिए काम नहीं है?

मैंने एक साधारण काउंटर बीन के साथ प्रयास किया है। सत्र का उपयोग किए बिना, दो अलग-अलग ब्राउज़रों में एक ही काउंटर बीन होता है ("वृद्धि" पर क्लिक करने से दोनों के लिए मूल्य बदल जाता है)। सत्र का उपयोग करके, मेरे पास दो अलग-अलग मान हैं, प्रत्येक ब्राउज़र के लिए प्रत्येक (फ़ायरफ़ॉक्स पर "वृद्धि" पर क्लिक करके, केवल फ़ायरफ़ॉक्स के बीन में जोड़ा गया है)।

लेकिन मेरे शिक्षक को बताया कि एक SFSB "एक ग्राहक के साथ बातचीत के राज्य" रहता है, तो क्यों यह सिर्फ का उपयोग कर एक HttpSession बिना काम नहीं करता?

अगर मैं सही ढंग से समझ, का उपयोग नहीं कर रहा है HttpSession एक SFSB एक SLSB बजाय साथ यह कर का एक ही साथ?

मुझे उम्मीद है कि मेरा प्रश्न स्पष्ट है और मेरी अंग्रेजी वह गरीब नहीं है!

संपादित करें: मैं लॉगिन सिस्टम पर काम कर रहा हूं। सब ठीक हो जाता है और लॉगिन पूरा करने के बाद यह मुझे एक प्रोफाइल पेज पर ले जाता है जो उपयोगकर्ता का डेटा दिखाता है। लेकिन पृष्ठ को पुनः लोड करने से मेरा डेटा गायब हो जाता है! मैंने लॉगिंग के दौरान HttpSession जोड़ने का प्रयास किया है लेकिन इस तरह से करने से डेटा लॉगआउट के बाद भी रहता है!

उत्तर

25

एक राज्यव्यापी सत्र बीन (एसएफएसबी) को वेब वातावरण में HTTP सत्र के साथ जोड़ा जाना चाहिए, क्योंकि यह एक शुद्ध व्यवसाय बीन है जो स्वयं वेब परत के बारे में कुछ भी नहीं जानता है।

परंपरागत रूप से ईजेबी भी अपने मॉड्यूल (ईजेबी मॉड्यूल) के अंदर अनिवार्य रहते थे, जो वेब कलाकृतियों तक पहुंच नहीं सकते थे, अगर वे चाहते थे। यह स्तरित सिस्टम का एक पहलू है। इसके बारे में अधिक जानकारी के लिए Packaging EJB in JavaEE 6 WAR vs EAR देखें।

स्टेटफुल सत्र सत्र के लिए मूल ग्राहक दूसरों के बीच थे डेस्कटॉप अनुप्रयोगों को स्विंग करना, जो एक बाइनरी प्रोटोकॉल के माध्यम से रिमोट ईजेबी सर्वर के साथ संवाद किया गया था। एक स्विंग एप्लिकेशन प्रॉक्सी/स्टब ऑब्जेक्ट के माध्यम से रिमोट स्टेटफुल सत्र सत्र बीन से कनेक्शन प्राप्त करेगा। इस प्रॉक्सी में एम्बेडेड किसी प्रकार का आईडी है जो सर्वर एक विशिष्ट एसएफएसबी के साथ संबद्ध हो सकता है।इस प्रॉक्सी ऑब्जेक्ट को पकड़कर, स्विंग क्लाइंट इसे बार-बार कॉल कर सकता है और वे उसी बीन इंस्टेंस पर जाएंगे। यह इस प्रकार क्लाइंट और सर्वर के बीच एक सत्र बना देगा।

किसी वेब एप्लिकेशन के मामले में, जब कोई ब्राउज़र जावा ईई वेब एप्लिकेशन के लिए प्रारंभिक अनुरोध करता है तो यह JSESSIONID प्राप्त करता है कि सर्वर एक विशिष्ट HTTPSession इंस्टेंस के साथ संबद्ध हो सकता है। इस JSESSIONID पर पकड़कर, ब्राउज़र इसे प्रत्येक अनुवर्ती अनुरोध के साथ प्रदान कर सकता है और यह उसी http सत्र सर्वर-पक्ष को सक्रिय करेगा।

तो, उन अवधारणाएं बहुत समान हैं, लेकिन वे स्वचालित रूप से एक दूसरे के लिए मानचित्र नहीं हैं।

ब्राउज़र केवल JSESSIONID प्राप्त करता है और किसी भी SFSB आईडी के बारे में कोई जानकारी नहीं है। स्विंग एप्लिकेशन के विपरीत, ब्राउज़र वेब पृष्ठों के साथ संचार करता है, सीधे जावा बीन्स के साथ नहीं।

किसी विशिष्ट राज्य सत्र सत्र बीन के क्लाइंट के अनुरोध को मैप करने के लिए, ईजेबी कंटेनर केवल SFSB प्रॉक्सी के माध्यम से प्रदान की गई आईडी के बारे में परवाह करता है। यह नहीं देख सकता कि कॉल वेब मॉड्यूल में कोड से उत्पन्न हुआ है और वास्तव में किसी भी HTTP संदर्भों तक नहीं पहुंच सकता/नहीं।

वेब परत क्लाइंट कोड है जो एसएफएसबी तक पहुंचता है उसे एक विशिष्ट प्रॉक्सी संदर्भ में 'होल्ड ऑन' होना चाहिए। वेब परत में किसी चीज़ को पकड़ना आम तौर पर HTTP सत्र में संग्रहीत करना है।

हालांकि एक पुल तकनीक है जिसे CDI कहा जाता है जो यह स्वचालित कनेक्शन बना सकता है। यदि आप अपने एसएफएसबी को सीडीआई के @SessionScoped के साथ एनोटेट करते हैं और सीडीआई के माध्यम से एसएफएसबी का संदर्भ प्राप्त करते हैं (उदाहरण के लिए @Inject का उपयोग करके), आपको अपने एसएफएसबी को मैन्युअल रूप से http सत्र में रखना नहीं है। हालांकि, दृश्यों के पीछे सीडीआई वैसे भी वैसे ही करेगा।

+0

ग्रेट उत्तर, अर्जुन। हालांकि, मेरा मानना ​​है कि आपका मतलब है @SessionScoped आपके उत्तर के अंतिम अनुच्छेद –

+0

@ जो.एम. त्रुटि को ढूंढने के लिए धन्यवाद;) फिक्स्ड! –

3

आप @RequestScoped के बजाय @SessionScoped साथ सेम परिभाषित करने की जरूरत (आप देख रहे हैं HttpSession बराबर समाधान के लिए)

कुछ

तरह
@SessionScoped 
public class SessionInfo implements Serializable{ 
    private String name; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

निम्नलिखित पर एक नज़र डालें (विस्तार से समझाया गया)

http://www.oracle.com/technetwork/articles/java/cdi-javaee-bien-225152.html