सर्वलेट्स कैसे काम करते हैं? तात्कालिकता, सत्र, साझा चर और बहु-प्रसार


1142

मान लीजिए, मेरे पास एक वेबसर्वर है जो कई सर्वलेट रखता है। उन सर्वलेट्स के बीच से गुजरने वाली जानकारी के लिए मैं सत्र और उदाहरण चर सेट कर रहा हूं।

अब, यदि 2 या अधिक उपयोगकर्ता इस सर्वर पर अनुरोध भेजते हैं तो सत्र चर का क्या होता है?
क्या वे सभी सभी उपयोगकर्ताओं के लिए सामान्य होंगे या वे प्रत्येक उपयोगकर्ता के लिए अलग-अलग होंगे?
यदि वे अलग-अलग हैं, तो सर्वर विभिन्न उपयोगकर्ताओं के बीच अंतर करने में कैसे सक्षम था?

इसी तरह का एक और सवाल, अगर कोई nउपयोगकर्ता किसी विशेष सर्वलेट तक पहुँच प्राप्त कर रहा है , तो यह सर्वलेट पहली बार केवल पहले उपयोगकर्ता द्वारा एक्सेस किया जाता है या क्या यह सभी उपयोगकर्ताओं के लिए अलग से त्वरित रूप से प्राप्त होता है?
दूसरे शब्दों में, उदाहरण चर का क्या होता है?

जवाबों:


1820

ServletContext

जब सर्वलेट कंटेनर (जैसे अपाचे टोमाकट ) शुरू होता है, तो यह अपने सभी वेब एप्लिकेशन को तैनात और लोड करेगा। जब कोई वेब एप्लिकेशन लोड होता है, तो सर्वलेट कंटेनर ServletContextएक बार बनाता है और इसे सर्वर की मेमोरी में रखता है। वेब ऐप web.xmlऔर सभी शामिल web-fragment.xmlफ़ाइलों को पार्स किया गया है, और प्रत्येक <servlet>, <filter>और <listener>पाया (या प्रत्येक वर्ग के साथ एनोटेट किया गया है @WebServlet, @WebFilterऔर @WebListenerक्रमशः) एक बार त्वरित किया जाता है और सर्वर की मेमोरी में भी रखा जाता है। प्रत्येक तात्कालिक फ़िल्टर के लिए, इसकी init()विधि एक नए के साथ होती है FilterConfig

जब किसी Servletका मान <servlet><load-on-startup>या उससे @WebServlet(loadOnStartup)अधिक होता है 0, तो init()एक नए के साथ स्टार्टअप के दौरान इसकी विधि भी लागू की जाती है ServletConfig। उन सर्वलेट्स को उस मान द्वारा निर्दिष्ट उसी क्रम में आरंभीकृत किया जाता है ( 11, 22 है, आदि)। एक ही मूल्य से अधिक सर्वलेट के लिए निर्दिष्ट किया जाता है, तो उन सर्वलेट्स में से प्रत्येक के एक ही क्रम में लोड किया जाता है के रूप में वे दिखाई देते हैं web.xml, web-fragment.xmlया @WebServletclassloading। घटना में "लोड-ऑन-स्टार्टअप" मूल्य अनुपस्थित है, init()जब भी HTTP अनुरोध पहली बार उस सर्वलेट को हिट करता है , तो विधि को रोक दिया जाएगा।

जब सर्वलेट कंटेनर उपरोक्त वर्णित प्रारंभिक चरणों के साथ समाप्त ServletContextListener#contextInitialized()हो जाता है , तो वसीयत को लागू किया जाएगा।

जब नीचे सर्वलेट कंटेनर बन्द हो जाता है, यह सब वेब अनुप्रयोगों अनलोड, invokes destroy()अपने सभी प्रारंभ सर्वलेट्स और फिल्टर, और सभी की विधि ServletContext, Servlet, Filterऔर Listenerउदाहरणों ट्रैश किए जाते हैं। अंत में ServletContextListener#contextDestroyed()मंगाया जाएगा।

HttpServletRequest और HttpServletResponse

सर्वलेट कंटेनर एक वेब सर्वर से जुड़ा होता है जो एक निश्चित पोर्ट नंबर पर HTTP अनुरोधों को सुनता है (पोर्ट 8080 आमतौर पर विकास के दौरान उपयोग किया जाता है और उत्पादन में पोर्ट 80)। जब कोई क्लाइंट (जैसे वेब ब्राउज़र वाला उपयोगकर्ता, या प्रोग्रामेटिक रूप से उपयोग करने वालाURLConnection ) HTTP रिक्वेस्ट भेजता है, तो सर्वलेट कंटेनर नए HttpServletRequestऔर HttpServletResponseऑब्जेक्ट बनाता है और उन्हें किसी भी Filterश्रृंखला में और अंततः, Servletउदाहरण के माध्यम से गुजरता है ।

फ़िल्टर के मामले में , doFilter()विधि को लागू किया जाता है। जब सर्वलेट कंटेनर का कोड कॉल करता है chain.doFilter(request, response), तो अनुरोध और प्रतिक्रिया अगले फ़िल्टर पर जारी रहती है, या शेष फ़िल्टर नहीं होने पर सर्वलेट को हिट करता है।

सर्वलेट्स के मामले में , service()विधि को लागू किया जाता है। डिफ़ॉल्ट रूप से, यह विधि निर्धारित करती है कि किस विधि doXxx()को बंद करना है request.getMethod()। यदि निर्धारित विधि सर्वलेट से अनुपस्थित है, तो प्रतिक्रिया में HTTP 405 त्रुटि वापस आ जाती है।

अनुरोध ऑब्जेक्ट HTTP अनुरोध के बारे में सभी जानकारी तक पहुंच प्रदान करता है, जैसे कि इसका URL, हेडर, क्वेरी स्ट्रिंग और बॉडी। प्रतिक्रिया ऑब्जेक्ट उदाहरण के लिए आपके द्वारा इच्छित तरीके से HTTP प्रतिक्रिया को नियंत्रित करने और भेजने की क्षमता प्रदान करता है, जिससे आप हेडर और बॉडी सेट कर सकते हैं (आमतौर पर जेएसपी फ़ाइल से उत्पन्न HTML सामग्री के साथ)। जब HTTP प्रतिक्रिया प्रतिबद्ध और समाप्त हो जाती है, तो अनुरोध और प्रतिक्रिया दोनों वस्तुओं को पुनर्नवीनीकरण किया जाता है और पुन: उपयोग के लिए उपलब्ध कराया जाता है।

HttpSession

जब कोई ग्राहक पहली बार वेबप पर जाता है और / या HttpSessionपहली बार के माध्यम से प्राप्त किया जाता है request.getSession(), तो सर्वलेट कंटेनर एक नई HttpSessionवस्तु बनाता है , एक लंबी और अनोखी आईडी (जिसे आप प्राप्त कर सकते हैं session.getId()) उत्पन्न करता है , और सर्वर में संग्रहीत करता है याद। सर्वलेट कंटेनर अपने नाम के साथ HTTP प्रतिक्रिया Cookieके Set-Cookieहेडर JSESSIONIDऔर अपने मूल्य के रूप में अद्वितीय सत्र आईडी भी सेट करता है ।

के अनुसार HTTP कुकी विनिर्देश (एक अनुबंध किसी भी सभ्य वेब ब्राउज़र और वेब सर्वर का पालन करना होगा), ग्राहक (वेब ब्राउज़र) इस कुकी का अनुवर्ती अनुरोधों में वापस भेजने के लिए आवश्यक है Cookieजब तक कि कुकी वैध है के लिए हैडर ( यानी यूनिक आईडी को एक अनपेक्षित सत्र का उल्लेख करना चाहिए और डोमेन और पथ सही है)। अपने ब्राउज़र में अंतर्निहित HTTP ट्रैफ़िक मॉनिटर का उपयोग करके, आप यह सत्यापित कर सकते हैं कि कुकी वैध है (क्रोम / फ़ायरफ़ॉक्स 23+ / IE9 + में F12 दबाएं और नेट / नेटवर्क टैब की जांच करें )। सर्वलेट कंटेनर Cookieनाम के साथ कुकी की उपस्थिति के लिए आने वाले हर HTTP अनुरोध के हेडर की जांच करेगा JSESSIONIDऔर HttpSessionसर्वर की मेमोरी से संबंधित प्राप्त करने के लिए इसके मूल्य (सत्र आईडी) का उपयोग करेगा ।

यह HttpSessionतब तक जीवित रहता है, जब तक कि इसमें निर्धारित समय सीमा से अधिक समय के लिए निष्क्रिय (यानी एक अनुरोध में इस्तेमाल नहीं किया गया) <session-timeout>, एक सेटिंग में web.xml। टाइमआउट मान 30 मिनट तक डिफॉल्ट करता है। इसलिए, जब ग्राहक निर्धारित समय से अधिक समय तक वेब ऐप पर नहीं जाता है, तो सर्वलेट कंटेनर सत्र को मिटा देता है। प्रत्येक बाद के अनुरोध, यहां तक ​​कि निर्दिष्ट कुकी के साथ, अब उसी सत्र तक पहुंच नहीं होगी; सर्वलेट कंटेनर एक नया सत्र बनाएगा।

क्लाइंट की तरफ, सेशन कुकी तब तक जीवित रहती है, जब तक ब्राउज़र इंस्टेंस चल रहा होता है। इसलिए, यदि क्लाइंट ब्राउज़र उदाहरण (सभी टैब / विंडो) को बंद कर देता है, तो सत्र क्लाइंट की तरफ से ट्रैश किया जाता है। एक नए ब्राउज़र उदाहरण में, सत्र से जुड़ी कुकी मौजूद नहीं होगी, इसलिए इसे अब नहीं भेजा जाएगा। यह एक पूरी तरह से नया बनाने HttpSessionका कारण बनता है , एक पूरी तरह से नए सत्र कुकी का उपयोग किया जाता है।

संक्षेप में

  • ServletContextजब तक वेब एप्लिकेशन जीवन के रूप में के लिए रहता है। यह बीच साझा किया जाता सब में अनुरोध सभी सत्रों।
  • HttpSessionजब तक ग्राहक एक ही ब्राउज़र उदाहरण के साथ वेब एप्लिकेशन के साथ सहभागिता जाती है और सत्र सर्वर साइड पर टाइम आउट हो गया नहीं किया गया है के लिए रहता है। यह एक ही सत्र में सभी अनुरोधों के बीच साझा किया जाता है ।
  • HttpServletRequestऔर HttpServletResponse, समय सर्वलेट ग्राहक से एक HTTP अनुरोध प्राप्त करता है से लाइव तक पूरा प्रतिक्रिया (वेब पृष्ठ) आ गया है। इसे कहीं और साझा नहीं किया जाता है।
  • सभी Servlet, Filterऔर Listenerउदाहरणों के रूप में लंबे वेब एप्लिकेशन जीवन के रूप में रहते हैं। वे के बीच साझा कर रहे हैं सभी में अनुरोध सभी सत्रों।
  • कोई भी attributeजिसे परिभाषित किया गया है ServletContext, HttpServletRequestऔर HttpSessionजब तक प्रश्न रहता है तब तक जीवित रहेगा। ऑब्जेक्ट स्वयं बीन मैनेजमेंट फ्रेमवर्क जैसे JSF, CDI, स्प्रिंग आदि में "स्कोप" का प्रतिनिधित्व करता है। वे फ्रेमवर्क अपने स्कोप्ड बीन्स को attributeइसके निकटतम मिलान वाले स्कोप के रूप में संग्रहीत करते हैं ।

धागा सुरक्षा

उस ने कहा, आपकी प्रमुख चिंता संभवतः धागा सुरक्षा है । अब आपको पता होना चाहिए कि सर्वलेट्स और फ़िल्टर सभी अनुरोधों के बीच साझा किए गए हैं। यह जावा के बारे में अच्छी बात है, यह बहुपरत है और विभिन्न थ्रेड्स (पढ़ें: HTTP अनुरोध) एक ही उदाहरण का उपयोग कर सकते हैं। यह अन्यथा बहुत अधिक महंगा होगा, init()और destroy()उन्हें हर एक अनुरोध के लिए।

आपको यह भी महसूस करना चाहिए कि आपको किसी सर्वलेट या फ़िल्टर के उदाहरण चर के रूप में किसी भी अनुरोध या सत्र स्कॉप्ड डेटा को असाइन नहीं करना चाहिए । इसे अन्य सत्रों में अन्य सभी अनुरोधों के बीच साझा किया जाएगा। यही कारण है कि है नहीं थ्रेड-सुरक्षित! नीचे दिया गया उदाहरण यह दिखाता है:

public class ExampleServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}

यह सभी देखें:


25
इसलिए जब मैं किसी तरह से JSessionId का पता लगा सकता हूं, जो एक ग्राहक को भेजा जाता है, तो मैं उसका सत्र चुरा सकता हूं?
Toskan

54
@ टॉस्कन: यह सही है। इसे सत्र निर्धारण हैक के रूप में जाना जाता है । कृपया ध्यान दें कि यह JSP / सर्वलेट के लिए विशिष्ट नहीं है। अन्य सभी सर्वर साइड भाषाएं जो कुकी द्वारा सत्र को बनाए रखती हैं, जैसे कि PHPSESSIDकुकी के साथ PHP , ASP.NET_SessionIDकुकी के साथ ASP.NET , वगैरह संवेदनशील हैं । यही कारण है कि ;jsessionid=xxxकुछ JSP / सर्वलेट MVC फ्रेमवर्क के साथ URL पुनर्लेखन स्वचालित रूप से किया जाता है। बस यह सुनिश्चित करें कि सत्र आईडी को कभी भी URL या वेबपेजों में अन्य माध्यमों से उजागर न किया जाए ताकि अनजान एंड्यूसर पर हमला न हो।
बालूसी

11
@ टोसकान: इसके अलावा, सुनिश्चित करें कि आपका वेबएप XSS हमलों के प्रति संवेदनशील नहीं है। यानी किसी भी उपयोगकर्ता द्वारा नियंत्रित इनपुट को अनसैप्ड रूप में फिर से परिभाषित न करें। XSS ने सभी एंड्यूज़र्स के सत्र आईडी एकत्र करने के तरीकों के लिए दरवाजे खोल दिए। यह भी देखें कि XSS के पीछे सामान्य अवधारणा क्या है?
बालुसक

2
@ बालसुख, मेरी मूर्खता के लिए क्षमा करें। इसका अर्थ है कि सभी उपयोगकर्ता इस iIsNOTThreadSafe के समान उदाहरण का उपयोग सही करते हैं?
ढक

4
@TwoThumbSticks 404 को तब लौटाया जाता है जब पूरी सर्वलेट अनुपस्थित होती है। सर्वलेट मौजूद होने पर 405 लौटाया जाता है, लेकिन वांछित doXxx () विधि लागू नहीं की जाती है।
बालुसक

428

सत्र

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

संक्षेप में: वेब सर्वर प्रत्येक आगंतुक को उसकी पहली यात्रा पर एक अद्वितीय पहचानकर्ता जारी करता है । आगंतुक को अगली बार उस आईडी को वापस लाना होगा, जिसे अगली बार उसके आसपास पहचाना जा सके। यह पहचानकर्ता सर्वर को एक सत्र के स्वामित्व वाली वस्तुओं को ठीक से अलग करने की अनुमति देता है।

सर्वलेट इंस्टेंटेशन

अगर लोड-ऑन-स्टार्टअप है झूठी :

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

अगर लोड-ऑन-स्टार्टअप है सच :

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

एक बार जब वह सेवा मोड पर और खांचे पर है, तो एक ही सर्वलेट अन्य सभी ग्राहकों के अनुरोधों पर काम करेगा।

यहां छवि विवरण दर्ज करें

प्रति ग्राहक एक उदाहरण होना एक अच्छा विचार क्यों नहीं है? इस बारे में सोचें: क्या आप आए हुए प्रत्येक ऑर्डर के लिए एक पिज्जा आदमी को नियुक्त करेंगे? ऐसा करें और आप कुछ ही समय में व्यवसाय से बाहर हो जाएंगे।

यह हालांकि एक छोटे जोखिम के साथ आता है। याद रखें: यह एकल व्यक्ति अपनी जेब में सभी ऑर्डर की जानकारी रखता है: इसलिए यदि आप सर्वलेट्स पर थ्रेड सुरक्षा के बारे में सतर्क नहीं हैं , तो वह एक निश्चित ग्राहक को गलत आदेश दे सकता है।


26
मेरी समझ के लिए आपकी तस्वीर बहुत अच्छी है। मेरा एक सवाल है, बहुत सारे पिज्जा ऑर्डर आने पर यह पिज्जा रेस्तरां क्या करेगा, बस एक पिज्जा आदमी की प्रतीक्षा करें या अधिक पिज्जा आदमी को किराए पर लें? धन्यवाद ।
zh18

6
वह to many requests at this moment. try again later
लौटाएंगे

3
सर्वलेट्स, पिज्जा डिलीवरी वालों के विपरीत, एक ही समय में एक से अधिक डिलीवरी कर सकते हैं। उन्हें केवल इस बात का विशेष ध्यान रखने की आवश्यकता है कि वे ग्राहक के पते, पिज्जा के स्वाद को कैसे लिखेंगे ...
ब्रूनो

42

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

संपादित करें सर्वलेट्स के अंदर सत्र के साथ काम करने के लिए यहां एक उत्कृष्ट ट्यूटोरियल है । और यहां जावा सर्वलेट्स के बारे में सूर्य से एक अध्याय है, वे क्या हैं और उनका उपयोग कैसे करें। उन दो लेखों के बीच, आपको अपने सभी सवालों के जवाब देने में सक्षम होना चाहिए।


यह मेरे लिए एक और सवाल लाता है, क्योंकि पूरे आवेदन के लिए केवल एक सर्वलेट संदर्भ है और हम इस सर्वलेटकॉन्सेट के माध्यम से सत्र चर तक पहुंच प्राप्त करते हैं, इसलिए प्रत्येक उपयोगकर्ता के लिए सत्र चर कैसे अद्वितीय हो सकते हैं? धन्यवाद ..
कू जॉन

1
आप सर्वलेट से सत्र को कैसे एक्सेस कर रहे हैं? आप servletContext.setAttribute () की बात नहीं कर रहे हैं, क्या आप?
मैट बी

4
@KuJon प्रत्येक वेब ऐप में एक ServletContextऑब्जेक्ट है। उस ऑब्जेक्ट में शून्य, एक या अधिक सत्र ऑब्जेक्ट हैं - सत्र ऑब्जेक्ट का संग्रह। प्रत्येक सत्र की पहचान किसी प्रकार के पहचानकर्ता स्ट्रिंग द्वारा की जाती है, जैसा कि अन्य उत्तर पर कार्टून में देखा जाता है। उस पहचानकर्ता को कुकी या URL-पुनर्लेखन द्वारा क्लाइंट पर ट्रैक किया जाता है। प्रत्येक सत्र ऑब्जेक्ट के अपने चर होते हैं।
तुलसी बोर्के

33

जब सर्वलेट कंटेनर (अपाचे टोमाकट की तरह) शुरू होता है, तो यह वेब से पढ़ेगा। एक्सएमएल फ़ाइल (केवल एक आवेदन) यदि कुछ भी गलत हो जाता है या कंटेनर साइड कंसोल पर एक त्रुटि दिखाती है, अन्यथा, यह सभी वेब को तैनात और लोड करेगा। web.xml (ताकि इसे तैनाती डिस्क्रिप्टर के रूप में नाम दिया गया है) का उपयोग करके अनुप्रयोग।

सर्वलेट के इंस्टेंटेशन चरण के दौरान, सर्वलेट इंस्टेंस तैयार है लेकिन यह ग्राहक के अनुरोध को पूरा नहीं कर सकता है क्योंकि यह जानकारी के दो टुकड़ों के साथ गायब है:
1: संदर्भ जानकारी
2: प्रारंभिक कॉन्फ़िगरेशन जानकारी

सर्वलेट इंजन सर्वलेट कॉनफिगर इंटरफ़ेस ऑब्जेक्ट बनाता है जो उपरोक्त लापता सूचनाओं को इनलेट में सेवित करता है सर्वलेट इंजन कॉल इनिट () की सर्विसलेट को एक तर्क के रूप में सर्वलेटऑफिग ऑब्जेक्ट संदर्भों की आपूर्ति करता है। एक बार init () पूरी तरह से निष्पादित सर्वलेट क्लाइंट अनुरोध को पूरा करने के लिए तैयार है।

Q) सर्वलेट के जीवनकाल में कितनी बार तात्कालिकता और आरंभीकरण होता है ??

ए) केवल एक बार (प्रत्येक ग्राहक अनुरोध के लिए एक नया धागा बनाया जाता है) सर्वलेट का केवल एक उदाहरण क्लाइंट अनुरोध के किसी भी नंबर पर कार्य करता है, यानी एक ग्राहक अनुरोध सर्वर की सेवा के बाद मर नहीं जाता है। यह अन्य ग्राहक अनुरोधों का इंतजार करता है अर्थात CGI (प्रत्येक ग्राहक अनुरोध के लिए एक नई प्रक्रिया बनाई गई है) सीमा को सर्वलेट (आंतरिक रूप से सर्वलेट इंजन थ्रेड बनाता है) के साथ दूर किया जाता है।

प्रश्न) सत्र की अवधारणा कैसे काम करती है?

ए) जब भी गेटसेशन () को HttpServletRequest ऑब्जेक्ट पर कॉल किया जाता है

चरण 1 : आने वाली सत्र आईडी के लिए अनुरोध वस्तु का मूल्यांकन किया जाता है।

चरण 2 : यदि आईडी उपलब्ध नहीं है तो एक नया HttpSession ऑब्जेक्ट बनाया गया है और इसकी संबंधित सत्र आईडी (HashTable का सत्र) जेनरेट की गई है, तो ID को httpservlet response ऑब्जेक्ट में संग्रहीत किया जाता है और HttpSession ऑब्जेक्ट का संदर्भ सर्वलेट (doGet / doPost) पर वापस आ जाता है ।

चरण 3 : यदि आईडी उपलब्ध ब्रांड नया सत्र ऑब्जेक्ट नहीं बनाया गया है, तो सत्र आईडी को कुंजी के रूप में सत्र आईडी का उपयोग करके सत्र संग्रह में बनाया गया है।

एक बार जब खोज सफल हो जाती है तो ID को HttpServletResponse में संग्रहीत किया जाता है और मौजूदा सत्र वस्तु संदर्भों को UserDefineservlet के doGet () या doPost () में लौटा दिया जाता है।

ध्यान दें:

1) जब सर्वलेट कोड से लेकर क्लाइंट तक कंट्रोल लीव्स भूल जाते हैं तो सर्वलेट कंटेनर अर्थात सर्वलेट इंजन द्वारा सेशन ऑब्जेक्ट रखा जाता है

2) मल्टीथ्रेडिंग को लागू करने के लिए सर्वलेट डेवलपर्स के लोगों पर छोड़ दिया जाता है।, मल्टीरेटेड कोड के बारे में परेशान करने के लिए क्लाइंट कुछ भी नहीं के कई अनुरोधों को संभालें।

इनशॉर्ट फॉर्म:

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


20

सत्र - क्रिस थॉम्पसन ने क्या कहा।

प्रारंभ - जब कंटेनर सर्वलेट को मैप किया (जब तक सर्वलेट साथ स्टार्टअप पर लोड करने के लिए कॉन्फ़िगर किया गया है पहले अनुरोध प्राप्त करता है एक सर्वलेट instantiated है <load-on-startup>में तत्व web.xml)। उसी उदाहरण का उपयोग बाद के अनुरोधों को पूरा करने के लिए किया जाता है।


3
सही बात। अतिरिक्त विचार: प्रत्येक अनुरोध को उस एकल सर्वलेट उदाहरण पर चलने के लिए एक नया (या पुनर्नवीनीकरण) धागा मिलता है। प्रत्येक सर्वलेट में एक उदाहरण है, और संभवतः कई थ्रेड्स (यदि कई एक साथ अनुरोध)।
बेसिल बोर्के

13

सर्वलेट स्पेसिफिकेशन JSR-315 स्पष्ट रूप से सेवा में वेब कंटेनर व्यवहार को परिभाषित करता है (और doGet, doPost, doPut आदि) विधियाँ (2.3.3.1 बहुस्तरीय मुद्दे, पृष्ठ 9):

एक सर्वलेट कंटेनर सर्वलेट की सेवा पद्धति के माध्यम से समवर्ती अनुरोध भेज सकता है। अनुरोधों को संभालने के लिए, सर्वलेट डेवलपर को सेवा पद्धति में कई थ्रेड्स के साथ समवर्ती प्रसंस्करण के लिए पर्याप्त प्रावधान करना चाहिए।

यद्यपि यह अनुशंसित नहीं है, डेवलपर के लिए एक विकल्प सिंगलट्रेडमॉडल इंटरफ़ेस को लागू करना है जिसके लिए कंटेनर को यह गारंटी देने की आवश्यकता है कि सेवा पद्धति में एक समय में केवल एक अनुरोध धागा है। एक सर्वलेट कंटेनर एक सर्वलेट पर अनुरोधों को क्रमबद्ध करके या सर्वलेट इंस्टेंस के एक पूल को बनाए रखकर इस आवश्यकता को पूरा कर सकता है। यदि सर्वलेट एक वेब एप्लिकेशन का हिस्सा है जिसे वितरण योग्य के रूप में चिह्नित किया गया है, तो कंटेनर प्रत्येक JVM में सर्वलेट इंस्टेंस का एक पूल बनाए रख सकता है जो कि एप्लिकेशन को वितरित किया गया है।

सर्वलेट्स सिंगलट्रेडमॉडल इंटरफ़ेस को लागू नहीं करने के लिए, यदि सेवा पद्धति (या doGet या doPost जैसी विधियाँ जो HttpServlet अमूर्त वर्ग की सेवा विधि में भेजी जाती हैं) को सिंक्रनाइज़ कीवर्ड के साथ परिभाषित किया गया है, तो सर्वलेट कंटेनर उदाहरण पूल दृष्टिकोण का उपयोग नहीं कर सकता है , लेकिन इसके माध्यम से अनुरोधों को क्रमबद्ध करना चाहिए। यह दृढ़ता से अनुशंसा की जाती है कि प्रदर्शन पर हानिकारक प्रभावों के कारण डेवलपर्स इन परिस्थितियों में सेवा पद्धति (या इसे प्रेषित करने के तरीके) को सिंक्रनाइज़ नहीं करते हैं


2
FYI करें, वर्तमान सर्वलेट कल्पना (2015-01) JSR 340 द्वारा परिभाषित 3.1 है ।
बेसिल बोर्के


1
बहुत साफ जवाब! @ तेहरिंड_डीजी
टॉम टेलर

0

जैसा कि ऊपर दिए गए स्पष्टीकरण से स्पष्ट है, सिंगलट्रेडमॉडल को लागू करके , एक सर्वलेट को सर्वेंट कंटेनर द्वारा थ्रेड-सेफ्टी का आश्वासन दिया जा सकता है। कंटेनर कार्यान्वयन 2 तरीकों से कर सकता है:

1) एकल उदाहरण के लिए अनुरोध (कतारबद्ध) करना - यह एक सर्वलेट के समान है जो सेवा / doXXX विधियों को सिंक्रनाइज़ करते हुए SingleThreadModel BUT को लागू नहीं कर रहा है; या

2) उदाहरणों का एक पूल बनाना - जो सर्वलेट के पर्यावरण के प्रतिबंधात्मक मापदंडों (मेमोरी / सीपीयू समय) के विपरीत बूट-अप / इनिशियलाइज़ेशन प्रयास / समय के बीच एक बेहतर विकल्प और ट्रेड-ऑफ है।


-1

नंबर सर्वलेट थ्रेड सुरक्षित नहीं हैं

यह एक बार में एक से अधिक धागों को एक्सेस करने की अनुमति देता है

यदि आप इसे थ्रेड सुरक्षित के रूप में सर्वलेट बनाना चाहते हैं।, यू के लिए जा सकते हैं

Implement SingleThreadInterface(i) जो एक रिक्त इंटरफ़ेस है कोई नहीं है

तरीकों

या हम विधियों को सिंक्रनाइज़ करने के लिए जा सकते हैं

हम पूरी सेवा विधि को सिंक्रोनाइज़ करके सिंक्रोनाइज़ कर सकते हैं

विधि के सामने कीवर्ड

उदाहरण::

public Synchronized class service(ServletRequest request,ServletResponse response)throws ServletException,IOException

या हम सिंक्रोनाइज़्ड ब्लॉक में कोड का ब्लॉक रख सकते हैं

उदाहरण::

Synchronized(Object)

{

----Instructions-----

}

मुझे लगता है कि सिंक्रोनाइज्ड ब्लॉक पूरी विधि बनाने से बेहतर है

सिंक्रनाइज़

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.