在同一 IF 语句中检查 Cookie 和会话
Check Cookies AND Session in Same IF Statement
我有一个功能可以检查 Session 和 Cookie 并根据它们重定向用户。
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.
我相信这是因为没有 cookies 存在。
我的问题是:我应该将会话和cookie的检查分开,还是可以在一个语句中完成?
谢谢!
您的代码需要 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>
也没有意义 - 该值从未使用过。只需在您已经有东西可以填充的地方声明变量。
您直接检查 Request
是否有一个名为“HR”的 cookie,如果没有这个名称的 cookie,它将抛出异常。因此,您首先需要检查 CookieCollection
是否有任何名称为“HR”的 cookie。这是检查 CookieCollection
是否有给定名称的 cookie 的方法。
if(Request.Cookies.Get("cookieNmae") !=null)
所以像这样更改您的 if 语句
if (Session["HR"] != null || Request.Cookies.Get("HR") !=null)
我有一个功能可以检查 Session 和 Cookie 并根据它们重定向用户。
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.
我相信这是因为没有 cookies 存在。
我的问题是:我应该将会话和cookie的检查分开,还是可以在一个语句中完成?
谢谢!
您的代码需要 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>
也没有意义 - 该值从未使用过。只需在您已经有东西可以填充的地方声明变量。
您直接检查 Request
是否有一个名为“HR”的 cookie,如果没有这个名称的 cookie,它将抛出异常。因此,您首先需要检查 CookieCollection
是否有任何名称为“HR”的 cookie。这是检查 CookieCollection
是否有给定名称的 cookie 的方法。
if(Request.Cookies.Get("cookieNmae") !=null)
所以像这样更改您的 if 语句
if (Session["HR"] != null || Request.Cookies.Get("HR") !=null)