2010-05-15 17 views
25

मैं प्रति ब्राउज़र टैब सत्र सत्र बनाए रखना चाहता हूं।asp.net - सत्र - एकाधिक ब्राउज़र टैब - विभिन्न सत्र?

क्या यह आसान (या यहां तक ​​कि संभव) ASP.NET में करना है?

उदाहरण: उपयोगकर्ता उपयोगकर्ता को 5 बार फ़ायरफ़ॉक्स में Ctrl-T हिट करता है और प्रत्येक टैब में साइट पर जाता है। मैं सर्वर

उत्तर

20

यूआरएल को छेड़छाड़ किए बिना एक उपयोगकर्ता के लिए बहु-टैब सत्र राज्यों को सुविधाजनक बनाने के लिए, निम्न कार्य करें।

आपके प्रपत्र लोड समारोह में, शामिल हैं:

Session(ViewState("_PageID").ToString() & "CheckBoxes") = D 

नोट्स:

  • रूप

    If Not IsPostback Then 
        'Generate a new PageiD' 
        ViewState("_PageID") = (New Random()).Next().ToString() 
    End If 
    

    आप अपने सत्र स्थिति के लिए कुछ सहेजते हैं, PageID शामिल सत्र आईडी सामान्य रूप से, आप भरोसा नहीं कर सकते कि दुर्भावनापूर्ण दर्शक नहीं बदलेंगे सत्र आईडी/पेजआईडी। यह केवल पर्यावरण के लिए एक वैध समाधान है जहां सभी उपयोगकर्ताओं पर भरोसा किया जा सकता है। सौभाग्य से, व्यूस्टेट एक छुपा इनपुट फ़ील्ड का उपयोग करने से अधिक सुरक्षा प्रदान करता है।

  • पोस्टबैक पर व्यूस्टेट को पुनर्स्थापित किए जाने तक आपको पृष्ठ आईडी तक पहुंच नहीं होगी। इसलिए, आपको पेज_इनिट() हैंडलर में पेजआईडी तक पहुंच नहीं होगी।
+1

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

+0

@pwdst उत्कृष्ट बिंदु, मैं मैच के समाधान को समायोजित कर दूंगा! धन्यवाद –

+2

यह एक प्रश्न का एक उत्कृष्ट समाधान है कि मुझे काम पर डेटा अखंडता के लिए इस सप्ताह से निपटना पड़ा। उपयोगकर्ता दूसरे टैब खोल रहे थे और फिर दूसरे रिकॉर्ड से जुड़े पाठ्यक्रम सत्र के साथ, पहले टैब में आयोजित रिकॉर्ड को अपडेट करने के लिए लौट रहे थे। मैंने गलत रिकॉर्ड पर गलत अपडेट को रोकने के लिए इस समाधान का एक संस्करण इस्तेमाल किया। – pwdst

14
<configuration> 
    <system.web> 
    <sessionState cookieless="true" 
     regenerateExpiredSessionId="true" /> 
    </system.web> 
</configuration> 

http://msdn.microsoft.com/en-us/library/ms178581.aspx

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

+0

कुकी-= "true" वास्तव में जरूरत है: कि समस्या मैं भी ViewState("_PageID")

ताकि मेरे कोड सी # में इस तरह दिखता का मूल्य जाँच हल करने के लिए? – ErTR

+0

@ Ertürk Öztürk: सवाल लगता है "मैं प्रति ब्राउज़र टैब सत्र सत्र बनाए रखना चाहता हूं।"। सभी ब्राउज़र उदाहरण एक ही कुकीज़ साझा करते हैं। – zerkms

+0

@zerkms मैं cookieless के साथ ठीक हूँ लेकिन मुझे इसे पृष्ठ लोड पर गतिशील रूप से सेट करने की आवश्यकता है। दुर्भाग्य से यह केवल पढ़ने के लिए है। – ErTR

0

Brian Webster के उत्तर का उपयोग करके मुझे XMLHttpRequests के साथ कोई समस्या मिली। यह निकला, XMLHttpRequests ने IsPostback ध्वज को सही पर सेट नहीं किया था और इसलिए अनुरोध एक नए अनुरोध की तरह दिखता था और कोई उस अनुरोध के लिए एक नया सत्र स्थिति समाप्त कर देगा।

protected dynamic sessionVar; //a copy of the session variable 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack && ViewState["_PageID"] == null) 
    { 
     ViewState["_PageID"] = (new Random()).Next().ToString(); 
     Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable 
    } 
    sessionVar = Session[ViewState["_PageID"] + "sessionVar"]; 
    //... 
} 
संबंधित मुद्दे