Безопасно ли обращаться к переменным сеанса asp.net через статические свойства статического объекта? - PullRequest
21 голосов
/ 10 мая 2010

Безопасен ли доступ к переменным сеанса 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;
        }
    }
}

Возможно ли, чтобы пользователь A мог получить доступ к данным сеанса пользователя B таким образом?

Ответы [ 3 ]

30 голосов
/ 10 мая 2010

Да, это нормально - просто убедитесь, что вы не делаете это:

public static class SessionHelper
{

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

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

Как я видел, этот способ показывает данные сеанса одного пользователя другому пользователю. (Хотя и в ASP.NET 1.1)

8 голосов
/ 10 мая 2010

ИМХО, это на самом деле хороший подход. Это безопасно для типов, добавьте ту абстракцию уровня, которая может позволить вам изменять вещи с минимальным воздействием.

Пример того, что вы можете изменить, если вы решили, что какое-то состояние должно быть перемещено в кэш или даже в базу данных в сочетании с кэшированием, это потребует дополнительной синхронизации потоков, но все они могут обрабатываться внутренними компонентами этого класса. Вы можете подумать об изменении имени класса на что-то менее специфичное для сессии.

Единственный комментарий, который я хотел бы дать вашему конкретному примеру, заключается в том, что вы должны проверить, что переменная Session не null, и либо вернуть соответствующее значение по умолчанию, либо утвердить, либо вызвать информационное исключение, если оно есть. На всякий случай, если свойство читается перед его установкой.

0 голосов
/ 09 ноября 2017

На самом деле, вот мой "базовый" SessionClass.

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
...