2010-05-10 6 views
19

क्या स्थिर ऑब्जेक्ट के स्थिर गुणों के माध्यम से asp.net सत्र चर का उपयोग करना सुरक्षित है?क्या स्थिर ऑब्जेक्ट के स्थिर गुणों के माध्यम से asp.net सत्र चर का उपयोग करना सुरक्षित है?

public static class SessionHelper 
{ 
    public static int Age 
    { 
     get 
     { 
      return (int)HttpContext.Current.Session["Age"]; 
     } 

     set 
     { 
      HttpContext.Current.Session["Age"] = value; 
     } 
    } 


    public static string Name 
    { 
     get 
     { 
      return (string)HttpContext.Current.Session["Name"]; 
     } 

     set 
     { 
      HttpContext.Current.Session["Name"] = value; 
     } 
    } 
} 

यह है कि USERA UserB के सत्र डेटा इस तरह से यहां पहुंच सकता है संभव है:

यहाँ मैं क्या मतलब है?

+1

HttpContext.Current थ्रेड से संदर्भ प्राप्त करता है। कंटेंट थ्रेड, अगर आप सोच रहे थे कि यह कैसे काम करता है। – Greg

उत्तर

30

हाँ, कि जिस तरह से ठीक है - ठीक वैसे ही ऐसा नहीं करते हैं सुनिश्चित करें:

public static class SessionHelper 
{ 

    private static HttpSession sess = HttpContext.Current.Session; 
    public static int Age 
    { 
     get 
     { 
      return (int)sess["Age"]; 
     } 

     set 
     { 
      sess["Age"] = value; 
     } 
    } 
} 

Ive इस तरह से किसी अन्य उपयोगकर्ता को एक उपयोगकर्ता के सत्र डेटा दिखाने देखा। (हालांकि एएसपी.नेट 1.1 में)

+1

+1 यह एक बड़ा दर्द होने का इंतजार कर रहा है। – Greg

+1

आईआईएस 6.0 पर चल रहे एएसपी.नेट एमवीसी 3 (.NET 4.0) का उपयोग करके मैं इस विशाल दर्द से गुजर गया। क्रॉस-सत्र प्रदूषण केवल भारी भार के तहत हुआ, इसलिए निदान करना मुश्किल था। जाहिर है यह अभी भी बाद के संस्करणों में भी होता है। –

+0

ऐसा क्यों होता है? सत्रों के बीच स्थैतिक HttpSession परिवर्तनीय रिसाव है क्योंकि यह और कक्षा स्थैतिक हैं (और इस प्रकार सत्र के बीच एक उदाहरण का पुन: उपयोग किया जा सकता है)? – benedikt

8

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

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

आपके विशेष उदाहरण पर एक टिप्पणी होगी कि आपको यह जांचना चाहिए कि सत्र चर null नहीं है और या तो एक उचित डिफ़ॉल्ट, जोर दें या अगर यह है तो एक सूचनात्मक अपवाद बढ़ाएं। बस इसे सेट करने से पहले संपत्ति को पढ़ा जाता है।

0

वास्तव में, यहां मेरा "आधार" सत्र क्लास है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

public static class CSession 
{ 
    private static readonly string zE = ""; 
    private static readonly string CrLF = Environment.NewLine; 
    private static bool bStopHere = true; 

    /// <summary> 
    /// Get a session variable 
    /// </summary> 
    /// <param name="pSessionKey"></param> 
    /// <returns></returns> 
    public static object Get(string pSessionKey) 
    { 
     object t = null; 
     if (HttpContext.Current.Session[pSessionKey] != null) { t = (object)HttpContext.Current.Session[pSessionKey]; } 
     return t; 
    }//object Get(string pSessionKey) 



    /// <summary> 
    /// Set a session variable 
    /// </summary> 
    /// <param name="pSessionKey"></param> 
    /// <param name="pObject"></param> 
    public static void Set(string pSessKey, object pObject) 
    { 
     HttpContext.Current.Session.Remove(pSessKey); 
     HttpContext.Current.Session.Add(pSessKey, pObject); 
    }//void Set(string pSessionKey, object pObject) 


    public static string GetString(string pSessKey) 
    { 
     string sTemp = zE; 
     object t = Get(pSessKey); 
     if (t != null) { sTemp = (string)t; } else { sTemp = zE; } 
     return sTemp; 
    }//string GetString(string pSessionKey) 


    public static int GetInt(string pSessKey) 
    { 
     int s = 0; 
     object t = Get(pSessKey); 
     if (t != null) { s = (int)t; } 
     return s; 
    }//int GetInt(string pSessionKey) 


    public static Int32 GetInt32(string pSessKey) 
    { 
     Int32 s = 0; 
     object t = Get(pSessKey); 
     if (t != null) { s = (Int32)t; } 
     return s; 
    }//Int32 GetInt32(string pSessionKey) 


    public static bool GetBool(string pSessKey) 
    { 
     bool s = false; 
     object t = Get(pSessKey); 
     if (t != null) { s = (bool)t; } 
     return s; 
    }//bool GetBool(string pSessionKey) 

}//static class CSession 
संबंधित मुद्दे