检查相同IF语句中的Cookie和会话

时间:2015-06-05 07:09:15

标签: asp.net session if-statement cookies

我有一个检查Session和Cookies的功能,并根据这些功能重定向用户。

private void CheckRecruiterLogin()
    {
        List<string> list = new List<string>();
        if (Session["Candidate"] != null ||
            Request.Cookies["Candidate"] != null)
        {
            list = (List<string>)Session["Candidate"];
            string status = list[1].ToString();
            if (status.Equals("applicant") ||
                Request.Cookies["Candidate"]["Status"].Equals("applicant"))
            {
                Response.Redirect("ApplicantHome.aspx");
            }
            if (status.Equals("preboarding") ||
                Request.Cookies["Candidate"]["Status"].Equals("preboarding"))
            {
                Response.Redirect("PreboardingHome.aspx");
            }
            else if (status.Equals("hiring") ||
                Request.Cookies["Candidate"]["Status"].Equals("hiring"))
            {
                Response.Redirect("HiringHome.aspx");
            }
        }
        else if (Session["HR"] != null || Request.Cookies["HR"] != null)
        {
            list = (List<string>)Session["HR"];
            string type = list[1].ToString();
            if (type.Equals("preboarder") ||
                Request.Cookies["HR"]["Type"].Equals("preboarder"))
            {
                Response.Redirect("PreboarderList.aspx");
            }
            else if (type.Equals("datamanager") ||
                Request.Cookies["HR"]["Type"].Equals("datamanager"))
            {
                Response.Redirect("HiringList.aspx");
            }
            else if (type.Equals("admin") ||
                Request.Cookies["HR"]["Type"].Equals("admin"))
            {
                Response.Redirect("AdminHome.aspx");
            }
        }
        else if (Session["HR"] == null &&
            Request.Cookies["HR"] == null)
        {
            Response.Redirect("index.aspx");
        }
    }

但应用程序抛出运行时异常,说Object reference not set to an instance of an object.我认为这是因为没有cookie存在。

我的问题是:我应该分开会话和cookie的检查,还是可以在一个声明中进行检查?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的代码需要 Cookie和会话。

如果是这样,您希望更改条件以使用&&而不是||

但是,如果可用,您更有可能打算使用会话,如果会话不存在则使用cookie。这很简单,只需将值存储在变量中,然后再使用它:

if (Session["Candidate"] != null || Request.Cookies["Candidate"] != null)
{
  var list = Session["Candidate"] as List<string>;
  var status = list == null ? Request.Cookies["Candidate"]["Status"] : list[1];

  if (status == "applicant")
  {
    ...
  }
  ...
}

也就是说,使用cookie进行安全检查是个坏主意 - 用户可见并且用户可以编辑。

此外,使用Equals毫无意义 - 只需使用==即可。这不是Java,.NET实际上是比较值,而不是引用。虽然使用不变文化进行比较可能是一个更好的主意,但不区分大小写。创建new List<string>也没有意义 - 永远不会使用该值。只需在你已经有东西要填充它的位置声明变量。

答案 1 :(得分:0)

如果Request有一个名为&#34; HR &#34;如果没有具有此名称的cookie,则会抛出异常。因此,您首先需要检查CookieCollection是否有任何名称为&#34; HR &#34;的Cookie。这是检查CookieCollection是否具有给定名称的cookie的方法。

if(Request.Cookies.Get("cookieNmae") !=null)

所以改变你的if语句

if (Session["HR"] != null || Request.Cookies.Get("HR") !=null)