2008-11-18 34 views
16

मेरे वेब ऐप में, जब कोई उपयोगकर्ता लॉग इन करता है, तो मैं अपने आईडी को सर्वलेट में मान्य आईडी के वेक्टर में जोड़ता हूं, जब वह लॉग आउट करता है, तो मैं वेक्टर से अपना आईडी हटा देता हूं, इसलिए मैं देख सकता हूं कि कितने मौजूदा उपयोगकर्ता सक्रिय हैं , यदि कोई उपयोगकर्ता लॉग आउट करने के भूल जाता है, मेरी servelt उत्पन्न एचटीएमएल है:ब्राउज़र बंद करने का पता कैसे लगाएं?

<meta http-equiv="Refresh" content="30; url=My_Servlet?User_Action=logout&User_Id=1111"> 
टैग में

स्वचालित रूप से उसे बाहर लॉग इन करें।

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

तो, मेरा सवाल है: मैं अपने ब्राउज़र को बंद करने वाले उपयोगकर्ताओं का पता कैसे लगा सकता हूं, इसलिए मेरा सर्वलेट वेक्टर से अपने आईडी हटा सकता है?

सक्रिय उपयोगकर्ता सूची::

User_1 : Machine_1 [ IP_1 address ] 
User_2 : Machine_2 [ IP_2 address ] 
User_3 : Machine_3 [ IP_3 address ] 
... 

मैं कैसे कर


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

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

उत्तर

13

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

हालांकि, सत्र सर्वर सक्रिय होने पर एप्लिकेशन सर्वर ट्रैक करेगा और सत्र को नष्ट होने पर भी आपको बताएगा (जैसे टाइम-आउट के कारण)। इन घटनाओं को प्राप्त करने के लिए HttpSessionListener को कॉन्फ़िगर करने के तरीके को देखने के लिए this page पर एक नज़र डालें। फिर आप सक्रिय सत्रों की संख्या का ट्रैक रख सकते हैं।

सक्रिय सत्रों की संख्या वर्तमान उपयोगकर्ताओं की वास्तविक संख्या के पीछे हो जाएगी, क्योंकि कुछ सत्र (कॉन्फ़िगर करने योग्य) समय को सत्र समाप्त होने से पहले समाप्त होना पड़ता है; हालांकि, यह कुछ हद तक करीब होना चाहिए (आप सटीकता बढ़ाने के लिए सत्र-टाइमआउट को कम कर सकते हैं) और यह 1 से अधिक क्लीनर और आसान है) सत्रों को स्वयं ट्रैक करना या 2) ब्राउज़र बंद होने पर सर्वर पर कुछ एसिंक्रोनस जावास्क्रिप्ट भेजना (जो भेजने की गारंटी नहीं है)।

+0

BTW - मैं पता नहीं कोड मैं जुड़ा हुआ है कि कैसे एक क्लस्टर/एकाधिक वी एम वातावरण में काम करेंगे। मुझे बहुत अच्छा संदेह नहीं होगा। –

+0

यह लिंक http://www.stardeveloper.com/articles/display.html?article=2001112001&page=1 टूटा हुआ है। अपना उत्तर अपडेट करें। – OO7

3

जावास्क्रिप्ट में आप onbeforeclose ईवेंट का उपयोग कर सकते हैं ताकि उपयोगकर्ता ब्राउज़र पर बंद होने पर सर्वर पर वापस कॉल कर सकें।

मैं आमतौर पर ऐसा करने के लिए एक सिंक्रोनस अजाक्स कॉल का उपयोग करता हूं।

+0

नहीं, मेरे जवाब देखने के ... – PhiLho

7

मेरा सुझाव है कि जब आप सर्वलेट इंजन सत्र को नष्ट कर लेते हैं तो आप आईडी हटा देते हैं। HttpSessionListener पंजीकृत करें जो उपयोगकर्ता की आईडी को हटा देता है जब sessionDestroyed() कहा जाता है।

Diodeus का विचार केवल आपको यह पता लगाने में मदद करेगा कि सत्र अधिक से अधिक है।

2

आप जो करने की कोशिश कर रहे हैं, उसे करने का कोई मूर्ख तरीका नहीं है, लेकिन दोनों sblundy और Diodeus की योजना है जो अधिकतर परिस्थितियों को कवर करेगी। ऐसा कुछ भी नहीं है जो आप किसी ऐसे व्यक्ति के बारे में कर सकें जो जावास्क्रिप्ट को अपने ब्राउज़र में बंद कर देता है, या उनका इंटरनेट कनेक्शन नीचे चला जाता है, या उनकी शक्ति समाप्त हो जाती है। निष्क्रियता की एक निश्चित अवधि के बाद आपको केवल सत्रों को कम करना चाहिए (जो मुझे लगता है कि सत्र विनाश सुनने के बारे में क्या है?)।

2

मुझे हाल ही में ऐसा करना पड़ा, और कुछ खोजों के बाद, मुझे नेट पर कुछ समाधान मिले ... उनमें से सभी सार्वभौमिक रूप से काम नहीं कर रहे थे!

इस कार्य के लिए ऑनबॉर्क्लोक्लोज़ और ऑनक्लोज़ इवेंट का उपयोग किया जाता है। लेकिन दो कैच हैं: जब उपयोगकर्ता पृष्ठ को फिर से लोड करता है या यहां तक ​​कि केवल वर्तमान पृष्ठ को बदलता है तो उन्हें निकाल दिया जाता है। वहाँ अगर घटना वास्तव में एक खिड़की/पृष्ठ/टैब को बंद करने (समापन समारोह पर बिगड़ जा रहा कुछ Dom गुण को देखकर) है को देखने के लिए चाल है, लेकिन:

  • वे निर्भर
  • चाल undocumented हैं ब्राउज़र कर रहे हैं, इस प्रकार भंगुर
  • और वास्तव में वे ब्राउज़र संस्करण/अपडेट करने के साथ अलग-अलग हो ...

और यह सब का सबसे बुरा, इन घटनाओं अब अधिकांश आधुनिक ब्राउज़र से, क्योंकि वे दुष्ट विज्ञापनों द्वारा दुर्व्यवहार किया गया है खिड़कियों बाहर पॉपिंग अनदेखी कर रहे हैं जब ब्राउज़र बंद हो रहा था। उन्हें सफारी, ओपेरा, आई 7, आदि में नहीं निकाल दिया गया है

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

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

+0

यह एक बहुत ही कामकाजी रूप से एक ही चीज है जो एक HttpSessionListener का उपयोग करने के समान है, सिवाय इसके कि आपको अजाक्स और सर्वर-साइड हैंडलर को स्वयं कोड करना होगा, पहिया का पुन: आविष्कार करना होगा। –

+0

आप मजाक कर रहे हैं, है ना? HttpSessionListener एक इंटरफ़ेस है, यह अजाक्स और न ही जादू प्रदान करता है। – PhiLho

0

यहां "ब्राउज़र बंद करने का पता लगाने" को पूरा करने का एक गंदा तरीका है मुझे यह साइट पर कहीं भी एक फ़ोरम में मिला, जब मुझे यह फिर से मिल जाए तो मैं उससे लिंक करूंगा।

http प्रतिक्रिया में अतिरिक्त शीर्षलेख जोड़ें। जब अतिरिक्त अनुरोध आते हैं तो इन अतिरिक्त शीर्षकों में शामिल होंगे। आप इन शीर्षकों की जांच कर सकते हैं और यदि वे मौजूद नहीं हैं तो आप सत्र को मार सकते हैं, इसलिए एक नया शुरू होगा। हालांकि ब्राउज़र बंद होने पर यह आपको "सूचित नहीं करता" है, तो यह आपको बता सकता है कि किसी ने अपनी खिड़की बंद कर दी है और वापस आने का प्रयास कर रहा है, क्योंकि आपके द्वारा जोड़े गए शीर्षलेख गायब होंगे।

wrapper.setHeader("Cache-Control", "no-cache, no-store, must-  revalidate"); 
wrapper.setHeader("Pragma", "no-cache"); 
wrapper.setDateHeader("Expires", 0); 

Where wrapper is a response wrapper. 

if (wrapper.getHeaderNames().size() < the number of headers you are expecting) 
request.getSession().invalidate(); 

Not perfect but it might help someone. 
+0

ठीक है, यह वास्तव में ब्राउज़र को बंद नहीं करता है, यह पता लगाता है कि कोई आपके क्लाइंट से आपके सर्वर पर वापस आ रहा है, आपके शामिल हेडर के बिना, तो यह उन्हें आपके लॉगिन पेज पर वापस भेजता है। तो यह वास्तव में एक लायक उत्तर नहीं है। – rjdamore

संबंधित मुद्दे