2010-11-24 74 views
2

当我开始开发Web应用程序我存储在两个会话变量类型安全编码

Session["UserName"]="username"; 
Session["Password"]="paswword-123"; 

但有人提出我的想法,创造出包含用户名和密码属性和一类用户的认证细节成功的身份验证我被要求创建类的实例,并设置UserName和Password属性并将该实例存储在会话中。

我被告知会话对象是TypeSafe。有人可以解释什么是类型安全编码和在会话中存储对象的优点。

+0

谁告诉你的?在什么情况下 - 上述?你有链接到一个页面说的那个? – Oded 2010-11-24 13:17:09

+0

当我在大学时,我的一位教授告诉我..有什么不对或无法理解? – Novice 2010-11-24 13:18:14

回答

6

基本上,直接在Session["something"]存储值的经典方法有两个缺点:

  • 魔术字符串:如果输错something,你的代码编译好,但你无论是运行时错误,或者更糟糕,你的代码中一个未被注意的错误。
  • 铸造:在阅读Session["something"]后,您需要将其转换为您需要的类型。 (这是什么意思“不是类型安全的”。)

使用存储在会话中的强类型对象消除了第二个问题。实际上,你的自定义对象仍然需要被投射,但它只有一个投射而不是两个(或十个)投射,这减少了出错的可能性。同样,错误的转换是只在运行时才被检测到的。

另一种方法是封装在静态属性的访问会话变量:

public class MySession { 
    public static string UserName { 
     get { return (string)HttpContext.Current.Session["UserName"]; } 
     set { HttpContext.Current.Session["UserName"] = value; } 
    } 
} 

当然,这两种方法可以结合起来,使您可以在一个共同的对象组相关的属性(用户名和密码)。

3

拥有带2个字段的用户类可以有很多原因,至于类型安全性,如果您曾在某处输入Session [“Pasword”],您将遇到一个不容易找到的错误,您将拥有在任何地方检查两个参数名称。你需要它们是正确的,而且它是一个很大的错误来源。一旦存储User对象而不是2个未连接的字符串,您将能够使用类型安全的代码(如User.Password),而不是尝试通过Session中的字符串索引器访问密码。此外,如果您的用户获得更多的字段,这是很常见的,您只需将它们添加到用户类,不开始创建新参数&名称并将它们存储在会话堆中。

至于类型安全编码,我认为http://en.wikipedia.org/wiki/Type_safety应该帮助,或任何其他类型的文章,这是非常受欢迎的主题,我认为。

另外我不认为你应该在会话中存储密码,取决于你的程序逻辑,但通常密码应该只用于计算其md5散列,并且以后再也不会使用。

0

那么你是朋友是一半的权利,但我不相信会话本质上是类型安全的。 Session集合存储Object的实例。因此,您可以存储任何类型的实例(字符串,int或自定义登录类),因为它们都来自对象。但是,当您检索该对象时,您不知道它是什么类型,并且在使用它之前需要小心地对它进行转换,并进行异常处理。 如能正常工作:

Session["UserName"] = "Freddy"; 
string theUserName = (string)Session["UserName"]; 

但是你可以尝试做以下,这将导致错误。

Session["UserName"] new StrangeDataClass(); //Uh Oh, that's not a string. 
string theUserName = (string)Session["UserName"]; //unexpected behaviour based on StrangeDataClass.ToString() implementation. 

要解决这个问题,你必须做到以下几点:

string theUserName = Session["UserName"] as string; 
if (string != null) 
    //The cast worked... 
else 
    //The cast failed, (or the string stored in session was null) 

有一个自定义登录对象稍微解决了这个问题,因为你只能有一个对象的后顾之忧,和一个铸造。您还可以使用额外信息轻松扩展登录对象,并且不必再进行强制转换。