网页登录界面进行登录后,如果不进行登录校验,则在其它页面无法知道该用户是否进行了登录。故需要对用户的登录进行校验,这里将介绍两种登录校验的方式。分别为利用自定义行为过滤器进行登录校验,另外一种是构建控制器基类的校验实现子类的登录校验。具体实现如下:
这里以Session的方式进行用户登录信息存储为例进行两种方式的介绍:
方式一:自定义行为过滤器校验:
第一步:在用户登录成功后,将用户信息添加到Session中:
//对提交的用户名和密码进行验证
public ActionResult ProcessLogin()
{
#region 验证码
//1、验证验证码是否正确
string inputNum = Request["vCode"];
string sessionNum = Session["VNum"] as string;
//校验完session后清空session
Session["VNum"] = null;
if (string.IsNullOrEmpty(sessionNum))
{
return Content("验证码输入错误!");
}
if (inputNum != sessionNum)
{
return Content("验证码输入错误!");
}
#endregion
#region 登录验证
string uid = Request["LoginCode"];
string pwd = Request["LoginPwd"];
short delNum=(short) DelFlagEnum.Normal;
UserInfo users= service.GetEntities(u => u.UName == uid && u.Pwd == pwd && u.DelFlag == delNum).FirstOrDefault();
if (users==null)
{
return Content("用户名或密码错误,请重新登录!");
}
Session["userLogin"] = users; //将登录的用户信息存储到Session中
return Content("OK");
#endregion
}
第二步:创建自定义行为过滤器类:LoginCheckFilterAttribute.cs具体代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyOA.UI.Models
{
public class LoginCheckFilterAttribute:ActionFilterAttribute
{
//为实现该过滤器的类提供设定值,以判定是否需要进行登录验证
public bool isChecked { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (isChecked)
{
// 校验用户是否登录,如果没有对应的Session存储登录对象,则表示没有进行登录,则直接将页面跳转到登录页面
if (filterContext.HttpContext.Session["userLogin"] == null)
{
filterContext.HttpContext.Response.Redirect("/UserLogin/Login");
}
}
}
}
}
第三步:对要进行登录验证的类或者方法添加上述自定义登录行为过滤器
using MyOA.UI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyOA.UI.Controllers
{
public class HomeController : Controller
{
[LoginCheckFilter(isChecked=true)]
public ActionResult Index()
{
return View();
}
}
}
利用自定义行为过滤器进行登录校验的主要步骤如上。如果某个类或者某个方法不需要实现登录校验,则将isCheck赋值为false即可。
方式二:建立控制器基类实现子类的登录校验
第一步:还是和上面的方法一样,将用户的登录信息存储到Session中;
第二步:构建基类控制器BaseController,并在基类控制器中实现登录校验:
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyOA.UI.Controllers
{
public class BaseController : Controller
{
//实现其它地方对登录用户信息的快速调用
public UserInfo userInfoLogin { get; set; }
//设定判定是否需要进行登录校验的标志
public bool isCheckLogin = true;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (isCheckLogin)
{
if (filterContext.HttpContext.Session["userLogin"] == null)
{
filterContext.HttpContext.Response.Redirect("/UserLogin/Login");
}
else
{
userInfoLogin = filterContext.HttpContext.Session["userLogin"] as UserInfo;
}
}
}
}
}
第三步:将需要进行登录校验的类继承自
BaseController基类控制器:
using MyOA.UI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyOA.UI.Controllers
{
public class HomeController :
BaseController
{
public ActionResult Index()
{
return View();
}
}
}