2010-09-08 16 views
10

अब तक मैं जावा में Httpsession अवधारणाओं को समझता हूं। अनुरोध के अनुसारजावा में सत्र क्या है?

HttpSession ses = req.getSession(true); 

सत्र ऑब्जेक्ट तैयार करेगा।

setAttribute("String", object); 

, 'स्ट्रिंग' बांधें, और सत्र ऑब्जेक्ट के साथ मूल्य।

getAttribute("String"); 

स्ट्रिंग से जुड़े ऑब्जेक्ट को वापस लौटाएगा, निर्दिष्ट।

क्या मुझे समझ नहीं पा रहा हूँ है: मैं की तरह HttpSession ses = req.getSession(true); एक सत्र वस्तु बनाने रहा हूँ और setAttribute("String", object); फोन करके इसके लिए एक नाम की स्थापना। यहां, यह कोड सर्वर के अंदर रहता है। प्रत्येक व्यक्ति के लिए, जब वह सर्वर में एक ही कोड लॉगिन करने का प्रयास करता है तो उसे निष्पादित किया जाएगा। इस विधि में setAttribute("String", object); स्ट्रिंग मान एक स्थिर है। इसलिए, बनाए गए प्रत्येक सत्र ऑब्जेक्ट को उसी स्ट्रिंग द्वारा बाध्य किया जाएगा जो मैंने प्रदान किया है। जब मैं अपने सत्र को सत्यापित करने के लिए स्ट्रिंग को पुनर्प्राप्त करने का प्रयास करता हूं या getAttribute("String"); लॉगआउट कार्रवाई के दौरान उसी स्थिर स्ट्रिंग मान को वापस कर दूंगा (क्या मैं सही !! ?? असल में मुझे नहीं पता, मैं केवल निष्पादन के तर्क के बारे में सोच रहा हूं)। फिर, मैं कैसे अमान्य कर सकता हूं।

मैंने वेब पर सभी ट्यूटोरियल में इस प्रकार का चित्रण देखा। क्या यह विशेषता सेट करने का वास्तविक तरीका है? या, वास्तविक आवेदन डेवलपर्स "स्ट्रिंग" क्षेत्र में एक चर यह गतिशील स्थापित करने के लिए

(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)

दे देंगे और मेरी अंतिम सवाल

WebContext ctx = WebContextFactory.get(); 
request = ctx.getHttpServletRequest(); 

क्या दो लाइनों के ऊपर क्या करते है? सीटीएक्स & अनुरोध में क्या संग्रहीत किया जाएगा? HttpSession ses = req.getSession(true); नए सत्र माध्यमों का निर्माण करेगा। एसईएस में क्या मूल्य संग्रहित है।

+28

ओह प्रिय, आप पहले उत्तर के लिए एक पूरे 10 मिनट तक इंतजार करना ... :-P –

+1

एक सत्र में एक ही उपयोगकर्ता से संबद्ध है था। दो अलग-अलग उपयोगकर्ता के पास अलग-अलग सत्र होते हैं। यदि आप एक ही उपयोगकर्ता के साथ कुछ साझा करना चाहते हैं तो सत्र ऑब्जेक्ट पर setAttribute का उपयोग करें।यदि एक से अधिक उपयोग के बीच, तो संदर्भ ऑब्जेक्ट का उपयोग करें। आप अनुरोध ऑब्जेक्ट को अटैचमेंट करके ऑब्जेक्ट्स भी साझा कर सकते हैं। –

उत्तर

14

कुछ [यादृच्छिक] precisions:

  1. आपको सत्र के लिए में प्रवेश करें/लॉगआउट तंत्र की जरूरत नहीं है।
  2. जावा सर्वलेट में, HTTP सत्रों दो तंत्र, HTTP कुकी का उपयोग कर पता लगाया जाता है (सबसे अधिक इस्तेमाल किया) या URL पुनर्लेखन (कुकी के बिना या कुकीज़ अक्षम साथ ब्राउज़रों का समर्थन करने के लिए)। केवल कुकीज़ का उपयोग करना सरल है, आपको कुछ विशेष करने की ज़रूरत नहीं है। यूआरएल पुनः लिखने के लिए, आपको अपने सर्वलेट/फ़िल्टर पर वापस इंगित सभी यूआरएल को संशोधित करने की जरूरत है।
  3. प्रत्येक बार जब आप request.getSession(true) पर कॉल करते हैं, तो HttpRequest ऑब्जेक्ट का निरीक्षण किया जाएगा ताकि कुकी में या तो एन्कोड किए गए सत्र आईडी को खोजने के लिए या यूआरएल पथ पैरामीटर (अर्ध-कॉलन का पालन करने वाला) हो। यदि सत्र आईडी नहीं मिल पाती है, तो एक नया सत्र सर्वलेट कंटेनर (यानी सर्वर) द्वारा बनाया जाएगा।
  4. सत्र आईडी को कुकी के रूप में प्रतिक्रिया में जोड़ा जाता है। यदि आप URL को फिर से लिखने का समर्थन करना चाहते हैं, तो आपके HTML दस्तावेज़ों में दिए गए लिंक को response.encodeURL() विधि का उपयोग करके संशोधित किया जाना चाहिए। कॉलिंग request.getSession(false) या बस request.getSession() सत्र आईडी नहीं मिलने पर सत्र में शून्य वापस आ जाएगा या सत्र आईडी किसी अमान्य सत्र को संदर्भित करती है।
  5. वहाँ यात्रा द्वारा एक भी HTTP सत्र, के रूप में जावा सत्र कुकीज़ ब्राउज़र में स्थायी रूप से संग्रहीत नहीं कर रहे हैं। तो ग्राहकों के बीच सत्र वस्तु साझा नहीं की जाती है। प्रत्येक उपयोगकर्ता का अपना निजी सत्र होता है।
  6. किसी दिए गए समय के लिए उपयोग नहीं किए जाने पर सत्र स्वचालित रूप से नष्ट हो जाते हैं। टाइम-आउट मान को web.xml फ़ाइल में कॉन्फ़िगर किया जा सकता है।
  7. invalidate() विधि का उपयोग करके दिए गए सत्र को स्पष्ट रूप से अमान्य किया जा सकता है।
  8. जब लोगों के बारे में बात कर रहे हैं JSESSIONID, वे HTTP जावा में सत्र ट्रैकिंग करते थे कुकी के मानक नाम की बात कर रहे।
11

मेरा सुझाव है कि आप जावा सत्रों पर tutorial पढ़ लें। प्रत्येक उपयोगकर्ता को एक अलग HttpSession ऑब्जेक्ट मिलता है, जो JSESSIONID अनुरोध/प्रतिक्रिया पैरामीटर के आधार पर जावा वेब सर्वर ब्राउज़र पर भेजता है। इसलिए प्रत्येक उपयोगकर्ता के पास एक ही नाम के साथ एक विशेषता हो सकती है, और इस विशेषता के लिए संग्रहीत मूल्य सभी उपयोगकर्ताओं के लिए अलग होगा।

इसके अलावा, वेबकॉन्टेक्स्ट फैक्ट्री और वेबकॉन्टेक्स्ट डीडब्लूआर कक्षाएं हैं जो सर्वलेट पैरामीटर प्राप्त करने का एक आसान तरीका प्रदान करती हैं।

+0

वास्तव में यह सुनिश्चित नहीं है कि यह क्यों कम किया गया था। – Pat

+0

हाँ, मुझे यह पता है। लेकिन मैं समझ नहीं पा रहा हूं कि उस चर 'ctx' और 'अनुरोध' में क्या संग्रहीत किया जाएगा। मैंने वहां क्या पूछा। WebContextFactory और WebContext क्या है? वे क्या करेंगे? –

+2

आप उन वर्गों के लिए javadocs पर एक नज़र उठाया है? HttpServletRequest: http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html, WebContextFactory: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/ 2.0.3/dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContextFactory.html, और वेबकॉन्टेक्स्ट: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/2.0.3/ DWR-2.0.3-javadoc.jar! /org/directwebremoting/WebContext.html –

8

जैसा कि मैं इसे समझता हूं, आपकी चिंताओं को HttpSession में चीजें संग्रहीत करते समय विभिन्न उपयोगकर्ताओं को अलग करने के बारे में हैं।

सर्वलेट कंटेनर (उदाहरण के लिए टोमकैट) इसकी JSESSIONID का उपयोग करने का ख्याल रखता है। वेबसाइट पर

  1. उपयोगकर्ता पहले लॉग:

    कहानी इस प्रकार है।

  2. सर्वलेट कंटेनर उपयोगकर्ता के ब्राउज़र पर पर एक कुकी सेट करता है, जो UNIQUE jsessionId संग्रहीत करता है।
  3. हर बार जब उपयोगकर्ता वेबसाइट पर जाता है, तो JSESSIONID कुकी वापस भेजी जाती है।
  4. सर्वलेट कंटेनर इसका उपयोग पर करता है जो ट्रैक करता है कि कौन है।
  5. इसी तरह, यह है कि यह कैसे ट्रैक डेटा के विभाजन की रखता है। प्रत्येक उपयोगकर्ता की ऑब्जेक्ट्स की अपनी बाल्टी है जिसे विशिष्ट रूप से JSESSIONID द्वारा पहचाना जाता है।

उम्मीद है कि कि (कम से कम आंशिक रूप से) आपके प्रश्न के उत्तर।

चीयर्स

+0

हाँ, आपने मेरे प्रश्न का आधा जवाब दिया है। मुझे एक सत्र को अमान्य करने के लिए क्या करना है (यानी मैं किसी विशेष व्यक्ति के लिए सत्र ऑब्जेक्ट को कैसे हटाऊंगा, जो लॉगआउट पर क्लिक करता है)? –

+0

मेरा मानना ​​है कि session.invalidate() सत्र को मारता है, इसलिए जब उपयोगकर्ता अगली बार साइट पर हिट, वे प्रक्रिया पर शुरू कर देंगे। – lucas1000001

+0

कृपया ध्यान दें कि सत्र ऑब्जेक्ट सभी उपयोगकर्ताओं द्वारा साझा किए गए सिंगलटन नहीं है - प्रत्येक उपयोगकर्ता का अपना स्वयं का ऑब्जेक्ट होता है! – lucas1000001

3

आपका बुनियादी सर्वलेट तरह

public class MyServlet{ 

public doGet(HttpServletRequest req, HttpServletResponse res){ 
//Parameter true: 
// create session if one does not exist. session should never be null 
//Parameter false: 
// return null if there is no session, used on pages where you want to 
// force a user to already have a session or be logged in 
//only need to use one of the two getSession() options here. 
//Just showing both for this test 
HttpSession sess = req.getSession(true); 
HttpSession sess2 = req.getSession(false); 

//set an Attribute in the request. This can be used to pass new values 
//to a forward or to a JSP 
req.setAttribute("myVar", "Hello World"); 
} 

} 

देखने के लिए अपने सत्र के लिए किसी भी विशेषता नाम कि पहले से ही किया जाता है स्थापित करने के लिए कोई जरूरत नहीं है जा रहा है। जैसा कि अन्य ने अन्य उत्तरों में सुझाव दिया है, आपके लिए sessionID स्टोर करने के लिए कुकीज़ या यूआरएल पुनः लिखने का उपयोग करें।

आप डीडब्ल्यूआर WebContext के साथ काम कर रहे हैं, यह बस, जैसा कि ऊपर एक ही बात कर रही है सिर्फ सामान्य रूप से अनुरोध वस्तु विधि में पारित नहीं किया जाता है, तो आप आप

के लिए उस अनुरोध को प्राप्त करने के लिए WebContext का उपयोग
public class DWRClass { 
public doSomething(){ 
WebContext ctx = WebContextFactory.get(); 
HttpServletRequest req = ctx.getHttpServletRequest(); 
HttpSession sess = req.getSession(); //no parameter is the same as passing true 

//Lets set another attribute for a forward or JSP to use 
ArrayList<Boolean> flags = new ArrayList<Boolean>(); 
req.setAttribute("listOfNames", flags); 
} 
} 
संबंधित मुद्दे