键入安全编码

Nov*_*ice 2 asp.net type-safety

当我开始开发Web应用程序时,我将用户的身份验证详细信息存储在两个会话变量中

 Session["UserName"]="username";
 Session["Password"]="paswword-123";
Run Code Online (Sandbox Code Playgroud)

但有人建议我创建一个包含UserName和Password属性的类,并且在成功身份验证时,我被要求创建该类的实例并设置UserName和Password属性并将该实例存储在会话中.

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

Hei*_*nzi 6

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

  • 魔术字符串:如果您输入错误something,您的代码编译得很好但是您会遇到运行时错误,或者更糟糕的是,您的代码中会出现一个未被注意的错误.
  • 施法:阅读后Session["something"],您需要将其转换为您需要的类型.(这就是"非类型安全"的含义.)

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

另一种方法是在静态属性中封装对Session变量的访问:

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

当然,这两种方法都可以组合在一起,允许您将相关属性(UserName和Password)分组到一个公共对象中.