2010-03-25 10 views
15

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

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

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

उन्हें कहने के अलावा उन्हें कॉपी और पेस्ट न करें, या उन्हें एक समय में केवल एक दर्ज करने के लिए मनाने के लिए, मैं इस स्थिति को कैसे होने से रोक सकता हूं?

+1

मैं गलत हो सकता हूं (इसलिए इसे एक उत्तर के रूप में नहीं डाल रहा), लेकिन मेरा मानना ​​है कि यह एक ब्राउज़र प्रतिबंध है। कुकीज विधि के अलावा आपने कोशिश की, मुझे नहीं लगता कि ब्राउज़रों को टैब में स्वतंत्र सत्रों का उपयोग करने में बहुत आसान होना होगा। इससे भी बदतर, भले ही आप इसे करने के लिए एक ब्राउज़र का प्रबंधन करते हैं, फिर भी अन्य लोग 'ठीक' करने के लिए हैं। – keyboardP

उत्तर

4

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

+1

बस 'सुरक्षित' द्वारा स्पष्टीकरण के लिए, मुझे लगता है कि आप हैकर हमले परिप्रेक्ष्य से इसका मतलब नहीं है। – keyboardP

+0

नहीं, बिलकुल नहीं, आप सही हैं। मैंने पोस्ट संपादित किया। –

2

क्या विभिन्न भौतिक निरीक्षणों तक पहुंचने के लिए उपयोगकर्ताओं को विभिन्न खातों के साथ लॉग इन होना चाहिए? ऐसा लगता है कि जब तक PhysicalInspectionID यूआरएल का हिस्सा है, तब एक ही समय में कई भौतिक निरीक्षणों को संपादित करने में कोई समस्या नहीं होनी चाहिए।

जैसे,

http://inspections.mydomain.com/edit/23

बेशक

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

0

अनुरोध के लिए कोई नया सत्र नहीं है जब अनुरोध में कोई रेफरर नहीं है। जो कॉपी-पेस्ट यूआरएल समस्या हल करता है। सत्र की दुकान करें जैसे आपने यूआरएल में किया था।

3

यह एक बहुत अच्छा सवाल है कि मैंने भी लंबे और कठिन विचार किया है।

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

आपको यह सुनिश्चित करने की ज़रूरत है कि आपका पूरा ऐप आईफ्रेम अनुकूल है।

+3

आपने वास्तव में यह कहा था। पहले मैंने सोचा था कि आप मजाक कर रहे थे, लेकिन मुझे नहीं लगता कि आप हैं। IFRAME? – jDeveloper

3

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

वेब एप्लिकेशन (और पृष्ठों) को एक एकल उपयोगकर्ता सत्र में एकाधिक निरीक्षण प्रक्रियाओं को संभालने में सक्षम होना चाहिए।

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

छद्म कोड अवधारणा

var inspectionID = this.inspectionLabel.Text; 
var inspectionSets = (Hashtable)Session["inspections"]; 
var inspection = (Inspection)inspectionSets[inspectionID]; 
1

यह है कि मैं क्या ASP.NET MVC में उपयोग प्रमाणीकृत उपयोगकर्ताओं ना करे के लिए कई टैब खोलने के लिए है:

<script language="javascript" type="text/javascript"> 
    @if(Request.IsAuthenticated) 
    { 
     <text> 
     if (window.name != 'singleWindow') { 
      window.location.href = "Content/ErrorPages/SingleTab.htm"; 
     } 
     </text> 
    } 
    else 
    { 
     <text> 
     window.name = "singleWindow"; 
     </text> 
    } 
</script> 

असल में, इस विंडो नाम पहली बार जब सेट उपयोगकर्ता लॉगिन पेज पर जाता है। लॉग इन करने के बाद, प्रत्येक आगामी पृष्ठ लोड के लिए विंडो नाम का परीक्षण किया जाता है।

दो समस्याओं:

  • wok नहीं करता है तो जावास्क्रिप्ट निष्क्रिय
  • अगर गलती से उपयोगकर्ता मूल टैब बंद कर देता है और फिर पता पट्टी में अपनी वेबसाइट में कुछ अन्य लिंक चिपकाता है, उपयोगकर्ता हमेशा प्राप्त होगा त्रुटि पृष्ठ उपयोगकर्ता को पुनर्प्राप्त करने का मौका देने के लिए, मैंने सिंगलटैब.htm पेज में "लॉग आउट" लिंक शामिल किया है, इसलिए उपयोगकर्ता अपनी सत्र कुकी को नष्ट कर सकता है और एक नया सत्र शुरू कर सकता है।
2

कि समस्या का एक समाधान द्वारा लागू किया जा सकता है:

public static class CommonHelper 
{ 
    public static bool SiteGuard 
    { 
     get 
     { 
      if(HttpContext.Current.Session["SiteGuard"] == null) 
       return true; 
      return (bool)HttpContext.Current.Session["SiteGuard"]; 
     } 
     set 
     { 
      HttpContext.Current.Session["SiteGuard"] = value; 
     } 
    } 
} 

public partial class TestPage : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
     { 
      bool go = false; 
      for(int i = 0; i < 50; i++) // wait for the service to work (5 secs max) 
      { 
       if(CommonHelper.SiteGuard) 
       { 
        go = true; 
        break; 
       } 
       Thread.Sleep(100); 
      } 
      if(!go) 
       Response.Redirect("Login.aspx"); 

      SiteGuard = false; // from now on, nobody can visit your site 
     } 
     // Now as long as Page.IsPostBack is true you are in a good shape 
    } 
} 

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

<script type="text/javascript"> 
    window.onbeforeunload = function (e) { 
     e = e || window.event; 
     if (e) { 
      // Invoke web service 
      YourProject.YourWebServiceName.FreeSiteGuard(); 
     } 
    }; 
</script> 
:

[WebMethod(EnableSession = true)] 
    public void FreeSiteGuard() 
    { 
     HttpContext.Current.Session["SiteGuard"] = null; 
    } 

मास्टर पृष्ठ में, या हर पृष्ठ पर निम्नलिखित जावास्क्रिप्ट जोड़ने

ध्यान दें कि आपकी साइट प्रतिक्रिया समय वेब सेवा की गति से प्रभावित हो जाता है।

+0

यदि उपयोगकर्ता जावास्क्रिप्ट को चालू करता है तो क्या होगा? – kat1330

+0

आप इसे पहचान सकते हैं और उपयोगकर्ता को पहली शुरुआत से कुछ भी करने से रोक सकते हैं। जावास्क्रिप्ट को सक्षम करने के लिए उसे संकेत दें। – yazanpro

+0

आप वेब एप्लिकेशन के भीतर किसी पृष्ठ पर अजाक्स कॉल के साथ webservice कॉल को प्रतिस्थापित कर सकते हैं। – ZooZ

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

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