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