Действительно ли безопасно получить доступ к переменным сеанса 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;
}
}
}
Действительно ли возможно, что Усера мог получить доступ к данным сессии userB этот путь?
Да, это нормально - просто убедитесь, что вы не этого делаете:
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)
ИМХО, это действительно хороший подход. Это типобезопасный вариант, добавьте абстракцию уровня, которая позволит вам изменять вещи с минимальным воздействием.
Пример того, что вы можете изменить: если вы решили, что какое-то состояние должно переместиться в кэш или даже в базу данных в сочетании с кешированием, это потребует дополнительной синхронизации потоков, но все это может быть обработано внутренними компонентами этого класса. Вы можете подумать об изменении имени класса на что-то менее специфичное для сеанса.
Единственный комментарий, который я хотел бы сделать к вашему конкретному примеру, заключается в том, что вы должны проверить, что переменная сеанса не равна null
, и либо вернуть соответствующее значение по умолчанию, либо подтвердить, либо вызвать информативное исключение, если это так. На всякий случай свойство читается перед установкой.