जेएसएफ को सर्वर की तरफ यूआई घटकों की स्थिति को बचाने की आवश्यकता क्यों है?
क्योंकि HTTP स्टेटलेस है और JSF स्टेटफुल है। जेएसएफ घटक वृक्ष गतिशील (प्रोग्रामेटिक) परिवर्तनों के अधीन है। जेएसएफ को बस सटीक स्थिति को जानने की जरूरत है क्योंकि यह तब था जब फॉर्म एंड्यूसर को प्रदर्शित किया गया था, ताकि यह मूल जेएसएफ घटक पेड़ द्वारा प्रदान की गई जानकारी के आधार पर पूरे जेएसएफ जीवनचक्र को सफलतापूर्वक संसाधित कर सके जब फॉर्म वापस सबमिट किया गया हो। सर्वर। घटक ट्री अनुरोध पैरामीटर नाम, आवश्यक कन्वर्टर्स / सत्यापनकर्ता, बाउंड प्रबंधित गुण और क्रिया विधियों के बारे में जानकारी प्रदान करता है।
जेएसएफ किस समय तक यूआई कंपोनेंट्स की स्थिति को सर्वर साइड में सेव करता है और यूआई कंपोनेंट की स्टेट इनफार्मेशन को सर्वर मेमोरी से कब हटाया जाता है?
उन दो सवालों को एक ही उबाल लगता है। वैसे भी, यह विशिष्ट कार्यान्वयन है और यह भी निर्भर करता है कि राज्य सर्वर या क्लाइंट पर सहेजा गया है या नहीं। थोड़ा सा अच्छा कार्यान्वयन इसे हटा देगा जब यह समाप्त हो गया है या जब कतार भरी हुई है। उदाहरण के लिए मोझरा में 15 तार्किक विचारों की डिफ़ॉल्ट सीमा होती है जब राज्य की बचत सत्र के लिए निर्धारित की जाती है। यह निम्नलिखित संदर्भ में निम्नलिखित के साथ विन्यास योग्य है web.xml
:
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>15</param-value>
</context-param>
अन्य मोआज़रा-विशिष्ट पार्म्स और इससे संबंधित उत्तर com.sun.faces.numberOfViewsInSession बनाम com.sun.faces.numberOfLogicalViews के लिए Mojarra FAQ भी देखें
एप्लिकेशन पर एक लॉग-इन उपयोगकर्ता के रूप में हालांकि पृष्ठों पर नेविगेट करता है, क्या घटक की स्थिति सर्वर पर जमा होती रहेगी?
तकनीकी रूप से, यह कार्यान्वयन पर निर्भर करता है। यदि आप पेज-टू-पेज नेविगेशन (सिर्फ GET अनुरोध) के बारे में बात कर रहे हैं, तो Mojarra सत्र में कुछ भी नहीं बचाएगा। यदि वे हालांकि POST अनुरोध (कमांडोलिंक / बटन के साथ फॉर्म) हैं, तो मोअज़रा सत्र में प्रत्येक फॉर्म की अधिकतम सीमा तक स्थिति को बचाएगा। यह एंड्यूसर को एक ही सत्र में विभिन्न ब्राउज़र टैब में कई रूपों को खोलने में सक्षम बनाता है।
या, जब राज्य की बचत ग्राहक के लिए निर्धारित की जाती है, तो JSF सत्र में कुछ भी संग्रहीत नहीं करेगा। आप निम्न संदर्भ में निम्नलिखित कर सकते हैं web.xml
:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
फिर इसे javax.faces.ViewState
प्रपत्र के नाम के साथ एक छिपे हुए इनपुट फ़ील्ड में एक एन्क्रिप्टेड स्ट्रिंग पर क्रमांकित किया जाएगा ।
मुझे समझ में नहीं आता है कि यूआई घटक की स्थिति को सर्वर साइड पर रखने का क्या लाभ है। सीधे प्रबंधित / परिवर्तित डेटा को प्रबंधित सेम में पर्याप्त रूप से पारित नहीं किया जा रहा है? क्या मुझे इससे बचने की कोशिश करनी चाहिए?
जेएसएफ की अखंडता और मजबूती सुनिश्चित करने के लिए यह पर्याप्त नहीं है। जेएसएफ एक गतिशील ढांचा है जिसमें नियंत्रण का एकल प्रवेश बिंदु है। राज्य प्रबंधन के बिना, एक निश्चित तरीके (जैसे जोड़ तोड़ disabled
, readonly
और rendered
विशेषताएँ) में HTTP अनुरोधों को बिगाड़ने / हैक करने में सक्षम होगा , JSF को अलग-अलग संभावित खतरनाक चीजों को करने के लिए। यहां तक कि सीएसआरएफ के हमलों और फिशिंग का भी खतरा होगा।
और अगर हजारों समवर्ती उपयोगकर्ता सत्र होते हैं, तो यह सर्वर की तरफ बहुत अधिक मेमोरी का उपभोग नहीं करेगा? मेरे पास एक एप्लिकेशन है जहां उपयोगकर्ता कुछ विषयों पर ब्लॉग पोस्ट कर सकते हैं। यह ब्लॉग आकार में काफी बड़ा है। जब ब्लॉगों को देखने के लिए पोस्ट बैक या अनुरोध किया जाएगा, तो बड़े ब्लॉग घटकों की स्थिति के हिस्से के रूप में सहेजे जाएंगे। यह बहुत अधिक स्मृति का उपभोग करेगा। क्या यह चिंता का विषय नहीं है?
स्मृति विशेष रूप से सस्ती है। बस आब्जर्वर को पर्याप्त मेमोरी दें। या यदि नेटवर्क बैंडविड्थ आपके लिए सस्ता है, तो बस ग्राहक की ओर जाने वाली बचत को स्विच करें। सबसे अच्छा मैच खोजने के लिए, समवर्ती उपयोगकर्ताओं की अपेक्षित अधिकतम मात्रा के साथ बस अपने वेबपेज को प्रोफाइल करें और फिर अपने विज्ञापनकर्ता को 125% ~ 150% अधिकतम मापी गई मेमोरी दें।
ध्यान दें कि JSF 2.0 ने राज्य प्रबंधन में बहुत सुधार किया है। यह आंशिक राज्य को बचाने के लिए संभव है (उदाहरण के लिए केवल<h:form>
से पूरे सामान के बजाय सहेजा जाएगा <html>
सब समाप्त करने के लिए जिस तरह से)। उदाहरण के लिए मोआजरा ऐसा करता है। 10 इनपुट फ़ील्ड (प्रत्येक एक लेबल और संदेश के साथ) और 2 बटन के साथ एक औसत फॉर्म 1KB से अधिक नहीं लेगा। सत्र में 15 विचारों के साथ, प्रति सत्र 15KB से अधिक नहीं होना चाहिए। ~ 1000 समवर्ती उपयोगकर्ता सत्रों के साथ, 15MB से अधिक नहीं होना चाहिए।
आपकी चिंता सत्र या अनुप्रयोग दायरे में वास्तविक वस्तुओं (प्रबंधित बीन्स और / या डीबी संस्थाओं) पर अधिक केंद्रित होनी चाहिए। मैंने बहुत सारे कोड और परियोजनाएं देखी हैं जो अनावश्यक रूप से एक सत्र स्कॉप्ड बीन के स्वाद में जावा की मेमोरी में संपूर्ण डेटाबेस तालिका को डुप्लिकेट करता है जहां रिकॉर्ड्स को फ़िल्टर / समूह / व्यवस्थित करने के लिए SQL के बजाय जावा का उपयोग किया जाता है। ~ 1000 रिकॉर्ड के साथ, यह आसानी से प्रति उपयोगकर्ता सत्र 10MB से अधिक हो जाएगा ।