ब्राउज़र-टैब में सत्र कैसे अलग करें?


135

JSP और सर्वलेट्स का उपयोग करके जावा में लागू एक वेब-एप्लिकेशन में; यदि मैं उपयोगकर्ता सत्र में जानकारी संग्रहीत करता हूं, तो यह जानकारी एक ही ब्राउज़र से सभी टैब से साझा की जाती है। ब्राउज़र-टैब में सत्र कैसे अलग करें? इस उदाहरण में:

<%@page language="java"%>
<%
String user = request.getParameter("user");
user = (user == null ? (String)session.getAttribute("SESSIONS_USER") : user);
session.setAttribute("SESSIONS_USER",user);
%>
<html><head></head><body>
<%=user %>
<form method="post">
User:<input name="user" value="">
<input type="submit" value="send">
</form>
</body></html>

इस कोड को एक jsp पृष्ठ पर कॉपी करें ( testpage.jsp), सर्वर पर एक वेब एप्लिकेशन के मौजूदा संदर्भ में इस फाइल को तैनात करें (मैं अपाचे टॉमकैट का उपयोग करता हूं), फिर सही URL ( localhost/context1/testpage.jsp) का उपयोग करके एक ब्राउज़र (FF, IE7 या ओपेरा) खोलें ( ) इनपुट में आपका नाम और फॉर्म सबमिट करें। फिर उसी ब्राउज़र में एक नया टैब खोलें, और फिर आप नए टैब पर अपना नाम (सत्र से प्राप्त करें) देख सकते हैं। ब्राउज़र-कैश के साथ सावधान रहें, कभी-कभी ऐसा लगता है कि ऐसा नहीं होता है, लेकिन यह कैश में है, दूसरे टैब को ताज़ा करें।

धन्यवाद।



1
यह एक ऐसा काम है जिसे उपयोगकर्ता को करना है: IE खोलें, "File-> New Session" पर क्लिक करें
स्टीफन स्टीगर

3
@ भंडार, आपका समाधान एक सामान्य समाधान नहीं है (अन्य ब्राउज़रों में काम नहीं करता है) और, सबसे महत्वपूर्ण, यह उपयोगकर्ता के अनुकूल नहीं है (उपयोगकर्ता सत्रों के बारे में नहीं जानते हैं)।
ओरियल टेराडास

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

जवाबों:


92

आप HTML5 SessionStorage (window.sessionStorage) का उपयोग कर सकते हैं। आप एक रैंडम आईडी जनरेट करेंगे और सेशन स्टोरेज प्रति ब्राउजर टैब में सेव करेंगे। फिर प्रत्येक ब्राउज़र टैब की अपनी आईडी होती है।

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


7
डॉक्स से: "सेशनस्टोरेज का उपयोग किया गया डेटा ब्राउज़र टैब में नहीं रहता है, भले ही दो टैब दोनों में एक ही डोमेन मूल के वेबपेज हों। दूसरे शब्दों में, सेशनस्टोरेज के अंदर डेटा न केवल डोमेन और इनवॉइसिंग पेज की निर्देशिका तक सीमित है, बल्कि वह ब्राउज़र टैब जिसमें पेज सम्‍मिलित है। कुकीज़ के सत्र के लिए कंट्रास्ट करें, जो टैब से टैब तक डेटा को बनाए रखता है। " सरल परीक्षण क्रोम और एफएफ में इस व्यवहार की पुष्टि करता है।
जस्वसन

21
ध्यान दें, Chrome के "डुप्लिकेट टैब" सुविधा का उपयोग करते समय आईडी को डुप्लिकेट किया जाएगा। यह आमतौर पर एक समस्या नहीं है, लेकिन इसके माध्यम से सोचा जाना चाहिए।
योशिय्याह डेनियल

सिवाय जब आप क्रोम या फ़ायरफ़ॉक्स में एक टैब "डुप्लिकेट" करते हैं। इस स्थिति में, SessionStorage की नकल की जाती है।
टियागो फ्रीटास ने

@Gonzalo Gallotti: और अगर सत्र सर्वर-साइड है तो यह कैसे मेरी मदद करेगा? )))
स्टीफन स्टीगर

@StefanSteiger। फिर आप अपने अजाक्स कॉल के साथ ब्राउज़रटैब आईडी (सेशन स्टोरेज में सेव) भेज सकते हैं। सर्वर साइड में आपको कस्टम लॉजिक की आवश्यकता होगी, क्योंकि WebSession वही है। लेकिन आप टैब द्वारा सत्र ऑब्जेक्ट के साथ एक HashMap बना सकते हैं।
गोंजालो गैलोटी

23

आपको महसूस करना होगा कि सर्वर-साइड सत्र HTTP पर एक कृत्रिम ऐड-ऑन हैं। चूंकि HTTP स्टेटलेस है, इसलिए सर्वर को किसी तरह यह पहचानने की जरूरत है कि एक अनुरोध एक विशेष उपयोगकर्ता का है जिसे वह जानता है और उसके लिए एक सत्र है। ऐसा करने के 2 तरीके हैं:

  • कुकीज़। क्लीनर और अधिक लोकप्रिय विधि, लेकिन इसका मतलब है कि एक उपयोगकर्ता द्वारा सभी ब्राउज़र टैब और विंडो सत्र साझा करते हैं - IMO यह वास्तव में वांछनीय है, और मैं एक साइट पर बहुत नाराज होऊंगा जिसने मुझे प्रत्येक नए टैब के लिए लॉगिन किया, क्योंकि मैं बहुत तीव्रता से टैब का उपयोग करें
  • URL पुनर्लेखन। साइट के किसी भी URL में एक सत्र ID है जो उसमें संलग्न है। यह अधिक काम है (आपको साइट-आंतरिक लिंक हर जगह कुछ करना है), लेकिन अलग-अलग टैब में अलग-अलग सत्र होना संभव बनाता है, हालांकि लिंक के माध्यम से खोले गए टैब अभी भी सत्र को साझा करेंगे। इसका अर्थ यह भी है कि उपयोगकर्ता को हमेशा आपकी साइट पर आने पर लॉग इन करना होगा।

आप वैसे भी क्या करने की कोशिश कर रहे हैं? आप अलग-अलग सत्र वाले टैब क्यों चाहते हैं? शायद सत्रों का उपयोग किए बिना अपने लक्ष्य को प्राप्त करने का एक तरीका है?

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


6
यह एक बड़े एप्लिकेशन के लिए है जो उपयोगकर्ता की जानकारी और ऊर्जावान रखता है। जब कोई भिन्न उपयोगकर्ताओं के साथ भिन्न टैब में लॉगिन करता है, परीक्षण के लिए या भिन्न भूमिकाओं के लिए, तो वह टैब से जानकारी पार कर रहा है।
ओरिऑल टेराडास

बस एक बहुत देर से ऐड-ऑन क्यों, क्योंकि: क्योंकि मुझे यह जानने की जरूरत है कि मेरी साइट पर WHICH पेज पता है, उदाहरण के लिए, एक उपयोगकर्ता पर ध्यान केंद्रित किया गया है, और न केवल यह कि वे पृष्ठ से पृष्ठ पर गए हैं ( इसके बजाय वे टैब से टैब पर गए)।
ओलिवर विलियम्स

16

Window.name जावास्क्रिप्ट संपत्ति, केवल एक चीज है जो टैब गतिविधि पर बनी रहेगी, लेकिन स्वतंत्र रह सकती है (URL guff के बजाय)।


3
window.sessionStorage साथ ही करते हैं
felickz

3
उपयोगकर्ता द्वारा "नए टैब में खुला" चुनने पर सेशन स्टोरेज एक नए टैब में कॉपी हो जाता है ... काश मेरे पास विवरण के लिए लिंक होता, लेकिन देखें: Bugzilla.mozilla.org/show_bug.cgi?id=818389
felbz

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

15

आपको नहीं करना चाहिए यदि आप ऐसा काम करना चाहते हैं, तो आपको उपयोगकर्ता को अपने एप्लिकेशन के एक ही उदाहरण का उपयोग करने के लिए मजबूर करना होगा, जिसमें मक्खी पर एक सेशनआईडी एक समान उपयोग करें (यह काम नहीं करेगा) यह आईडी हर आईडी में पास होती है।

मुझे नहीं पता कि आपको इसकी आवश्यकता क्यों है लेकिन जब तक आपको पूरी तरह से अनुपयोगी आवेदन करने की आवश्यकता नहीं है, तब तक ऐसा न करें।


9
यह एक बड़े एप्लिकेशन के लिए है जो उपयोगकर्ता की जानकारी और ऊर्जावान रखता है। जब कोई भिन्न उपयोगकर्ताओं के साथ भिन्न टैब में लॉगिन करता है, परीक्षण के लिए या भिन्न भूमिकाओं के लिए, तो वह टैब से जानकारी पार कर रहा है।
ओरिऑल टेराडास

38
पुराना उत्तर मुझे पता है, लेकिन Google मेल आपको प्रति टैब अलग-अलग खाते रखने की अनुमति देता है और यह "पूरी तरह से अनुपयोगी अनुप्रयोग" नहीं है
जॉर्ज

2
@George, उत्तर अभी भी सही है, और आपके उदाहरण के लिए आप url नंबर में देखेंगे कुकीज़ में संग्रहीत खातों के सूचकांक का प्रतिनिधित्व करते हैं, Google मेल सिर्फ सभी कुकीज़ को संग्रहीत कर रहा है और url के अनुसार एक का चयन करें।
मम्मड़

5
सुनिश्चित नहीं है कि उत्तर अभी भी सही है, आप स्पष्ट रूप से कर सकते हैं। जीमेल करता है। जैसा कि यह कैसे करता है, यह सुरुचिपूर्ण नहीं हो सकता है लेकिन यह काम करता है और यही महत्वपूर्ण है
जॉर्ज

2
पुराना उत्तर लेकिन मैं जोड़ सकता हूं कि व्हाट्सएप और टेलीग्राम आपको एक ही समय में दो टैब खोलने की अनुमति नहीं देते हैं। यह उन्हें अनुपयोगी नहीं बनाता है
चार्ली

13

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

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

इस दृष्टिकोण के लिए एक चेतावनी: आपके पास कोई भी सामान्य AJAX कॉल नहीं हो सकता है (यानी, जो आपके सत्र पर निर्भर करते हैं) एक विंडो में होती है जिसमें फोकस नहीं होता है (उदाहरण के लिए यदि आपके पास कॉल देरी से हो रही है), जब तक कि आप मैन्युअल रूप से उससे पहले एक AJAX पुनः लॉगिन कॉल करें। तो वास्तव में आप सभी की जरूरत है अपने AJAX समारोह की जाँच करने के लिए सबसे पहले सुनिश्चित करें कि localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, और यदि नहीं, तो AJAX में पहले लॉग इन करें।

एक और दौड़ की स्थिति है: यदि आप इसे तेज करने के लिए खिड़कियों को तेजी से स्विच कर सकते हैं, तो आप एक relogin1-> relogin2-> ajax1-> ajax2 अनुक्रम के साथ गलत सत्र के तहत बनाया जा सकता है। एक सरणी पर लॉगिन AJAX अनुरोधों को धकेल कर और फिर एक नया लॉगिन अनुरोध जारी करने से पहले, सभी वर्तमान अनुरोधों को रद्द कर दें।

विंडो रीफ़्रेश करने के लिए अंतिम गोच देखने के लिए है। यदि किसी ने AJAX लॉगिन अनुरोध सक्रिय करते समय विंडो को ताज़ा किया है, लेकिन पूरा नहीं हुआ है, तो वह गलत व्यक्ति के नाम से ताज़ा हो जाएगा। इस मामले में आप संभावित मिक्सअप के बारे में उपयोगकर्ता को चेतावनी देने और उन्हें रद्द करने पर क्लिक करने के लिए नॉनस्टैंडर्ड पहले से लोड किए गए इवेंट का उपयोग कर सकते हैं, इस बीच AJAX लॉगिन अनुरोध को फिर से जारी कर सकते हैं। फिर अनुरोध पूरा होने से पहले ओके पर क्लिक करने से (या गलती से एंटर / स्पेसबार से टकराने से, केवल वही तरीका है, क्योंकि ओके - दुर्भाग्य से इस मामले के लिए है - डिफ़ॉल्ट।) इस मामले को संभालने के अन्य तरीके भी हैं, जैसे F5 और Ctrl + R / Alt + R प्रेस का पता लगाना, जो ज्यादातर मामलों में काम करेगा लेकिन उपयोगकर्ता कीबोर्ड शॉर्टकट पुन: संयोजन या वैकल्पिक OS उपयोग द्वारा विफल हो सकता है। हालांकि, यह वास्तविकता में एक किनारे का मामला है, और सबसे खराब स्थिति यह है कि कभी भी बुरा नहीं होता है: एक सम्मान प्रणाली विन्यास में, आपको गलत व्यक्ति के रूप में लॉग इन किया जाएगा (लेकिन आप यह स्पष्ट कर सकते हैं कि यह रंगों, शैलियों के साथ पृष्ठों को वैयक्तिकृत करके, प्रमुख रूप से प्रदर्शित नाम हैं,) आदि।); पासवर्ड कॉन्फ़िगरेशन में, ओनस आखिरी व्यक्ति पर है जिसने अपना पासवर्ड लॉग इन किया है या अपना सत्र साझा किया है, या यदि यह व्यक्ति वास्तव में वर्तमान उपयोगकर्ता है, तो कोई उल्लंघन नहीं है।

लेकिन अंत में आपके पास एक उपयोगकर्ता-प्रति-टैब अनुप्रयोग है (उम्मीद है कि) यह केवल उसी तरह से कार्य करता है, जैसा कि आवश्यक रूप से प्रोफाइल को सेट किए बिना, IE का उपयोग करना या URL को फिर से लिखना। सुनिश्चित करें कि आप प्रत्येक टैब में यह स्पष्ट करते हैं कि उस विशेष टैब में लॉग इन किया गया है, हालांकि ...


6
+1 क्योंकि आपने वास्तव में इस बारे में सोचने के लिए समय लिया है! :-) सभी कैविटीज़ को देखते हुए आप जानते हैं कि यह एक बुरा विचार है। इस सामग्री से सीखे गए मेरे पाठों को सही मायने में समझना है कि किस सत्र में डेटा जाना चाहिए और कौन सा डेटा नहीं होना चाहिए।
पीटर

10

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

तो समाधान यादृच्छिक उप डोमेन था।

23423.abc.com
242234.abc.com
235643.abc.com

इसलिए हमने अपने सिस्टम व्यवस्थापक से * .abc.com के लिए SSL प्रमाणपत्रों को कॉन्फ़िगर करने के लिए कहा। बल्कि abc.com फिर थोड़ा कोड परिवर्तन के साथ, जब भी कोई उपयोगकर्ता लॉगिन करने का प्रयास करता है, तो वह एक यादृच्छिक सबडोमेन नंबर के साथ एक टैब में लॉग इन हो जाता है। इसलिए प्रत्येक टैब का अपना सत्र स्वतंत्र रूप से हो सकता है। किसी भी संघर्ष से बचने के लिए, हमने उपयोगकर्ता आईडी के हैश या md5 का उपयोग करके यादृच्छिक संख्या विकसित की है।


3
यह URL-पुनर्लेखन के लिए एक चतुर विकल्प की तरह लगता है। आप एक HTTP-अनुरूप जगह में वांछित चर (सत्र आईडी) के साथ समाप्त होते हैं जो दृश्यमान है, लेकिन अप्रिय नहीं है। दिमाग में आने वाले वसंत: 1) को DNS पर वाइल्डकार्ड की जरूरत होती है, जाहिर है, 2) आपकी पूरी वेबसाइट को किसी भी निरपेक्ष URL से बचना चाहिए जो उपयोगकर्ता को वापस मार्ग में ले जाए (उदाहरण के लिए "www" उपडोमेन, 3) शायद वेब क्रॉलर को बाहर रखना चाहते हैं , लेकिन यह शायद एक निजी-वेब स्थिति है ताकि पहले से ही ऐसा किया जा सके। इसे साझा करने के लिए धन्यवाद!
रॉन बुर्क

@ user3534653: मुझे दृष्टिकोण पसंद है। लेकिन आपने कहा "कोई प्रोग्रामिंग शामिल नहीं है"। फिर आप "थोड़ा कोड परिवर्तन के साथ" कहने के लिए जाते हैं। तो क्या वास्तव में, थोड़ा कोड परिवर्तन प्रोग्रामिंग नहीं है? ;) इसके अलावा, यह दृष्टिकोण काम नहीं कर सकता है यदि आपके पास विहित लिंक के साथ कई अनुप्रयोग हैं जहां डोमेन हार्ड-कोडित / कॉन्फ़िगर किया गया है (कैनोनिक रूप से)।
स्टीफन स्टीगर

5

मैं यहाँ ईमानदार रहूँगा। । । उपरोक्त सब कुछ सच हो सकता है या नहीं भी हो सकता है, लेकिन यह सब WAY बहुत जटिल लगता है, या पता नहीं चलता है कि किस टैब में सर्वर साइड का उपयोग किया जा रहा है।

कभी-कभी हमें ओकाम के रेजर को लागू करने की आवश्यकता होती है।

यहाँ ओक्टम का दृष्टिकोण है: (नहीं, मैं ऑकैम नहीं हूँ, वह 1347 में मर गया)

1) लोड पर आपके पेज के लिए एक ब्राउज़र अद्वितीय आईडी असाइन करें। । । अगर और केवल अगर खिड़की में अभी तक आईडी नहीं है (तो एक उपसर्ग और एक पहचान का उपयोग करें)

2) आपके पास प्रत्येक पृष्ठ पर (एक वैश्विक फ़ाइल या किसी चीज़ का उपयोग करें) फ़ोकस इवेंट और / या माउसओवर इवेंट का पता लगाने के लिए बस कोड रखें। (मैं कोड लिखने में आसानी के लिए इस भाग के लिए jquery का उपयोग करूँगा)

3) अपने फ़ोकस (और / या माउसओवर) फ़ंक्शन में, उसमें window.name के साथ कुकी सेट करें

4) जब आपके टैब विशिष्ट डेटा को पढ़ने / लिखने की आवश्यकता होती है, तो अपने सर्वर साइड से उस कुकी मूल्य को पढ़ें।

ग्राहक की ओर:

//Events 
$(window).ready(function() {generateWindowID()});
$(window).focus(function() {setAppId()});
$(window).mouseover(function() {setAppId()});


function generateWindowID()
{
    //first see if the name is already set, if not, set it.
    if (se_appframe().name.indexOf("SEAppId") == -1){
            "window.name = 'SEAppId' + (new Date()).getTime()
    }
    setAppId()
}

function setAppId()
{
    //generate the cookie
    strCookie = 'seAppId=' + se_appframe().name + ';';
    strCookie += ' path=/';

    if (window.location.protocol.toLowerCase() == 'https:'){
        strCookie += ' secure;';
    }

    document.cookie = strCookie;
}

सर्वर साइड (C # - उदाहरण के लिए)

//variable name 
string varname = "";
HttpCookie aCookie = Request.Cookies["seAppId"];
if(aCookie != null) {
     varname  = Request.Cookies["seAppId"].Value + "_";
}
varname += "_mySessionVariable";

//write session data 
Session[varname] = "ABC123";

//readsession data 
String myVariable = Session[varname];

किया हुआ।


1
मुझे वास्तव में आपका सरलीकृत उत्तर और ओक्टम का उस्तरा संदर्भ पसंद है। बस दो बार जांचना चाहता था कि यह समाधान अभी भी आपके लिए काम कर रहा है।
जेफ मैरिनो

1
यह ध्यान देने योग्य है कि यदि पेज को रीफ्रेश करके अपना सत्र रखना चाहिए तो यह तरीका काम नहीं करेगा। Window.sessionStorage का उपयोग करने के एक अन्य उत्तर में अन्य सुझाए गए दृष्टिकोण मुझे अधिक उचित लगते हैं।
रॉसेफेल्ड

@quijibo अभी भी मेरे आवेदन में पूरी तरह से काम करता है, हाँ। पृष्ठ को ताज़ा करने के लिए, कुछ ब्राउज़रों के लिए सही हो सकता है, window.sessionStorage समस्या का समाधान कर सकता है, इसे आज़माया नहीं गया
माइक ए।

3
फ़ंक्शन "se_appframe ()" क्या है?
आंद्रे मिरांडा

Se_appframe क्या है ?
किकेनेट

2

जब आप किसी एकल पृष्ठ (जैसे index.html / jsp / जो भी हो) को शुरू करने के लिए एक अद्वितीय पहचानकर्ता को जोड़ने के लिए लिंक-पुनर्लेखन का उपयोग कर सकते हैं। ब्राउज़र आपके सभी टैब के लिए एक ही कुकीज़ का उपयोग करेगा, इसलिए आप जो कुछ भी कुकीज़ में डालते हैं वह अद्वितीय नहीं होगा।


2
मुझे लगता है कि सत्रों को सांकेतिक शब्दों में बदलना एक थकाऊ और त्रुटिपूर्ण है। मेरे पास एक बड़ा एप्लिकेशन है, बहुत सारे लिंक के साथ, मुझे पारदर्शी समाधान की आवश्यकता है या कार्यान्वयन में आसान है।
ओरिऑल टेराडास

2

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

हालाँकि यह मुख्य रूप से JSF के उद्देश्य से है, एक नज़र और जाँचें कि क्या ऐसा कुछ है जहाँ से आप कुछ विचार ले सकते हैं: http://docs.jboss.org/seam/latest/reference/en-US/html_single/#d053620


2

जावास्क्रिप्ट में, मैं विशिष्ट रूप से एक ब्राउजर विंडो को दूसरे से कैसे पहचान सकता हूं जो कि एक ही कुकडबेड सत्र के तहत हो।

अनिवार्य रूप से window.name का उपयोग करें। यदि इसका सेट नहीं है, तो इसे एक अनूठे मूल्य पर सेट करें और इसका उपयोग करें। यह एक ही सत्र से संबंधित टैब में भिन्न होगा।


1

एक और तरीका जो काम करता है वह है एक अद्वितीय विंडो आईडी बनाना और डेटाबेस आईडी में सत्र आईडी के साथ इस मूल्य को संग्रहीत करना। मेरे द्वारा अक्सर उपयोग की जाने वाली विंडो आईडी पूर्णांक (अब) है। यह मान तब बनाया जाता है जब कोई विंडो खोली जाती है और उसी विंडो पर फिर से असाइन किया जाता है यदि विंडो रीफ्रेश की जाती है, फिर से लोड की जाती है या खुद को सबमिट की जाती है। लिंक का उपयोग करके विंडो मान (इनपुट) स्थानीय तालिका में सहेजे जाते हैं। जब एक मूल्य की आवश्यकता होती है, तो इसे विंडो आईडी / सत्र आईडी लिंक के आधार पर डेटाबेस तालिका से प्राप्त किया जाता है। हालांकि इस दृष्टिकोण के लिए स्थानीय डेटाबेस की आवश्यकता होती है, लेकिन यह वास्तव में मूर्खतापूर्ण है। डेटाबेस तालिका का उपयोग मेरे लिए आसान था, लेकिन मुझे कोई कारण नहीं दिखता कि स्थानीय सरणियाँ सिर्फ काम नहीं करेंगी।


1

मैंने हाल ही में कुकीज़ का उपयोग करके इस समस्या का समाधान विकसित किया है। यहाँ मेरे समाधान की एक कड़ी है। मैंने ASP.NET का उपयोग करके समाधान का नमूना कोड भी शामिल किया है, यदि आपको आवश्यकता हो तो आपको इसे JSP या Servelets के लिए अनुकूलित करने में सक्षम होना चाहिए।

https://sites.google.com/site/sarittechworld/track-client-windows



1

नोट: यहाँ समाधान आवेदन डिजाइन चरण में किया जाना चाहिए। बाद में इसे इंजीनियर करना मुश्किल होगा।

सत्र पहचानकर्ता के आसपास से गुजरने के लिए एक छिपे हुए क्षेत्र का उपयोग करें

इसके लिए काम करने के लिए प्रत्येक पृष्ठ में एक फॉर्म शामिल होना चाहिए:

<form method="post" action="/handler">

  <input type="hidden" name="sessionId" value="123456890123456890ABCDEF01" />
  <input type="hidden" name="action" value="" />

</form>

नेविगेशन सहित, आपके पक्ष की प्रत्येक क्रिया, फॉर्म वापस पोस्ट करती है ( actionजैसा उचित हो) सेट करें । के लिए "असुरक्षित" अनुरोध, यदि आप किसी अन्य पैरामीटर शामिल कर सकते, वाले डेटा की एक JSON मूल्य प्रस्तुत किया जाना कहते हैं:

<input type="hidden" name="action" value="completeCheckout" />
<input type="hidden" name="data" value='{ "cardNumber" : "4111111111111111", ... ' />

चूंकि कोई कुकीज़ नहीं हैं, प्रत्येक टैब स्वतंत्र होगा और उसी ब्राउज़र में अन्य सत्रों का ज्ञान नहीं होगा।

बहुत सारे फायदे, खासकर जब सुरक्षा की बात आती है:

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

कुछ नुकसान:

  • बैक बटन कार्यक्षमता वांछित हो सकती है।
  • कैशिंग के साथ बहुत प्रभावी नहीं है क्योंकि हर क्रिया एक POST है।

अधिक जानकारी यहाँ


1

मैंने इसका निम्नलिखित तरीके से हल किया:

  • मैंने एक नाम नियत किया है, यह नाम कनेक्शन संसाधन के समान है।
  • प्लस 1 संलग्न कनेक्शन के लिए कुकी में संग्रहीत से छुटकारा पाने के लिए।
  • मैंने सभी xmloutput प्रतिक्रिया को कैप्चर करने के लिए एक फ़ंक्शन बनाया है और साइड प्रारूप और कुकी को json प्रारूप में असाइन किया है। मैं यह प्रत्येक window.name के लिए करता हूं।

यहाँ कोड है:

var deferred = $q.defer(),
        self = this,
        onConnect = function(status){
          if (status === Strophe.Status.CONNECTING) {
            deferred.notify({status: 'connecting'});
          } else if (status === Strophe.Status.CONNFAIL) {
            self.connected = false;
            deferred.notify({status: 'fail'});
          } else if (status === Strophe.Status.DISCONNECTING) {
            deferred.notify({status: 'disconnecting'});
          } else if (status === Strophe.Status.DISCONNECTED) {
            self.connected = false;
            deferred.notify({status: 'disconnected'});
          } else if (status === Strophe.Status.CONNECTED) {
            self.connection.send($pres().tree());
            self.connected = true;
            deferred.resolve({status: 'connected'});
          } else if (status === Strophe.Status.ATTACHED) {
            deferred.resolve({status: 'attached'});
            self.connected = true;
          }
        },
        output = function(data){
          if (self.connected){
            var rid = $(data).attr('rid'),
                sid = $(data).attr('sid'),
                storage = {};

            if (localStorageService.cookie.get('day_bind')){
              storage = localStorageService.cookie.get('day_bind');
            }else{
              storage = {};
            }
            storage[$window.name] = sid + '-' + rid;
            localStorageService.cookie.set('day_bind', angular.toJson(storage));
          }
        };
    if ($window.name){
      var storage = localStorageService.cookie.get('day_bind'),
          value = storage[$window.name].split('-')
          sid = value[0],
          rid = value[1];
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.attach('bosh@' + BoshDomain + '/' + $window.name, sid, parseInt(rid, 10) + 1, onConnect);
    }else{
      $window.name = 'web_' + (new Date()).getTime();
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.connect('bosh@' + BoshDomain + '/' + $window.name, '123456', onConnect);
    }

मुझे आशा है कि आप मदद करेंगे


0

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

इन उत्तरों को पढ़ने के बाद, विशेष रूप से माइकल बोर्गवर्ड द्वारा दिया गया, मुझे उस कार्य प्रवाह का एहसास हुआ, जिसे अस्तित्व में होना चाहिए:

  1. यदि उपयोगकर्ता लॉगिन स्क्रीन पर नेविगेट करता है, तो मौजूदा सत्र की जांच करें। यदि कोई मौजूद है तो लॉगिन स्क्रीन को बायपास करें और उन्हें स्वागत स्क्रीन पर भेजें।
  2. यदि उपयोगकर्ता (मेरे मामले में) नामांकन स्क्रीन पर नेविगेट करता है, तो मौजूदा सत्र की जांच करें। यदि कोई मौजूद है, तो उपयोगकर्ता को बताएं कि आप उस सत्र को लॉग आउट करने जा रहे हैं। यदि वे सहमत हैं, तो लॉग आउट करें और नामांकन शुरू करें।

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

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

हालांकि, इस दृष्टिकोण में कुछ गंभीर चेतावनी हैं। कम से कम यह तथ्य नहीं है कि परीक्षक क्या परीक्षण कर रहा है, उत्पादन में नहीं चलने वाला है।

इसलिए मुझे लगता है कि मुझे यह कहना पड़ा है, यह अंततः एक बुरा विचार है।


0

अगर यह पहले से सेट नहीं है, तो timeStamp को window.sessionStorage में संग्रहीत करना। यह प्रत्येक टैब के लिए एक अनूठा मूल्य देगा (भले ही URL समान हों)

http://www.javascriptkit.com/javatutors/domstorage.shtml

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage

उम्मीद है की यह मदद करेगा।


1
यह शायद ठीक है, लेकिन सैद्धांतिक रूप से असुरक्षित है। कुछ ऑपरेटिंग सिस्टम (जैसे विंडोज) में एक बहुत ही मोटे टाइमस्टैम्प ग्रैन्युलैरिटी है जिसका मतलब है कि आप कई बार टाइमस्टैम्प को देख सकते हैं और समान मूल्य वापस पा सकते हैं। इसके अलावा, यदि आप एक क्रैश के बाद एक ब्राउज़र को फिर से खोलते हैं और यह एक ही टाइमस्टैम्प प्राप्त कर सकता है तो एक बार में सभी टैब को फिर से खोल देता है।
गिली

0
How to differ sessions in browser-tabs?

ब्राउज़र टैब में सत्रों को अलग करने का सबसे सीधा तरीका कुकीज़ को सेट करने के लिए आपके विशेष डोमेन को अस्वीकृत करना है। इस तरह, आपके पास अलग टैब से अलग सत्र हो सकते हैं। कहते हैं कि आप इस डोमेन से कुकीज़ हटाते हैं: www.xyz.com। आप टैब 1 खोलें, लॉगिन करें और ब्राउज़ करना शुरू करें। फिर आप टैब 2 खोलते हैं, और आप या तो एक ही उपयोगकर्ता या एक अलग के रूप में लॉगिन कर सकते हैं; किसी भी तरह, आपके पास टैब 1 से अलग एक सत्र होगा।

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


0

आपको करने की आवश्यकता होगी

1- खातों की सूची के लिए एक कुकी स्टोर करें

2- वैकल्पिक एक डिफ़ॉल्ट के लिए एक कुकी की दुकान

3- एएक्स 1, एसीसी 2 जैसे सूचकांक के साथ प्रत्येक खाते के लिए स्टोर करें

4 - यूआरएल में डाल कुछ खातों के सूचकांक का प्रतिनिधित्व करते हैं और यदि आप डिफ़ॉल्ट का चयन नहीं करेंगे, जैसे कि google mail domain.com/0/some-url >> 0 यहाँ खाते के सूचकांक का प्रतिनिधित्व करते हैं, तो आपको यह भी जानना होगा कि कैसे urlwrite का उपयोग करें

5- कुकी का चयन करते समय, अपने urlpath के अनुसार इसे चुनें और खाता सूचकांक का प्रतिनिधित्व करें

सादर


0

मुझे कई कार्यान्वयन दिखाई देते हैं जिनमें सत्र आईडी कुकीज़ में हेरफेर करने के लिए क्लाइंट साइड परिवर्तन होते हैं। लेकिन सामान्य सत्र में आईडी कुकीज़ HttpOnly होनी चाहिए ताकि जावा-स्क्रिप्ट का उपयोग न हो सके अन्यथा यह सत्र Hijack Gru XSS को जन्म दे सकता है


0

यदि यह इसलिए है क्योंकि प्रत्येक टैब आपके एप्लिकेशन में एक अलग प्रवाह चला रहा होगा, और दोनों प्रवाह को मिलाने से समस्याएँ उत्पन्न होंगी, तो बेहतर होगा कि अपने सत्र ऑब्जेक्ट को "क्षेत्रीय" करें, ताकि प्रत्येक प्रवाह सत्र के एक अलग क्षेत्र का उपयोग करेगा

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

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