mvc过滤器的使用
网站系统一般都会有登陆验证功能,在传统架构的asp.net web程序中我们一般采用检测cookie或者session配合IHttpHandler类进行验证用户的登陆会话状态,在MVC中我们则可以使用过滤器的方式来限制非登陆用户对类或者方法的访问!

什么是过滤器呢,也就是说每个网页(mvc中的Action或者是Controller)开始加载的时候都要先经过它,在它的内部中我们实现一些逻辑来告诉控制器应该返回什么样的视图!接下来我们根据验证用户是否已经登陆来做个登陆状态的过滤器!
1. 首先,我们要在登陆的Action中创建一个用户的登陆票据并写入客户端一个加密后的票据,然后再执行验证成功后的业务逻辑!
代码如下:
|
[HttpPost] public ActionResult LoginPage(LoginModel lm) { LoginBll lb = new LoginBll(); if(lb.Login(lm)) { //添加用户验证票据 最后一个参数为票据的数据值 FormsAuthenticationTicket ticket= new FormsAuthenticationTicket(1,lm.StuName, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), true,lm.StuName); //设置cookie名称 string cookieName = FormsAuthentication.FormsCookieName + "Student"; //添加加密后的票据到新创建的cookie中 HttpCookie cookie = new HttpCookie(cookieName, FormsAuthentication.Encrypt(ticket)); Response.Cookies.Add(cookie); return RedirectToAction("MainPage", "Student",null); } else { ModelState.AddModelError("Error","用户名或密码错误!"); return View(); } } |
2. 创建好登陆成功后写入cookie的操作后,我们需要去App_Start文件夹下新建个类LoginFilter (App_Start文件夹下的类在网站运行的时候就会启动),接着我们让该类继承两个接口分别是:FilterAttribute,IActionFilter 并实现IActionFilter中的接口成员。
代码如下:
|
public class LoginFilter : FilterAttribute,IActionFilter { public void OnActionExecuted( ActionExecutedContext filterContext ) { //页面加载后的逻辑代码填写此处 } public void OnActionExecuting( ActionExecutingContext filterContext ) { try { //获取cookie名称 string cookieName = FormsAuthentication.FormsCookieName + "Student"; //获取用户计算机本地的cookie var v =filterContext.HttpContext.Request.Cookies[cookieName].Value; //解密cookie FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(v); //获取cookie中的数据(我们存放的为用户姓名) string username = authTicket.UserData; ProjectReviewDBEntities prdb = new ProjectReviewDBEntities(); //在数据库中查找有无该用户 MVC_Pro.Models.Student st =prdb.Students.SingleOrDefault(stu => stu.StuName == username); if (st == null) { //转到登陆页面 filterContext.HttpContext.Response.Redirect("~/LoginController/LoginPage"); } } catch { filterContext.HttpContext.Response.Redirect("~/LoginController/LoginPage"); } } } |
3. 创建好我们的过滤器后,就可以在某些页面需要进行是否登陆验证的时候添加到该Action 的特性上或者如果某个Controller中的所有Aciton都需要验证登陆的时候我们就可以在该Controller的特性上加上该过滤器!
代码如下:
|
namespace MVC_Pro.Controllers { [LoginFilter] public class StudentController : Controller { // // GET:/Student/ public ActionResult MainPage() { return View(); } } } |
这时候我们的页面在加载的时候就会按照我们过滤器的逻辑已经页面是否具备登陆过滤器特性来防止用户不经过登陆而直接浏览页面!
本文来源 我爱IT技术网 http://www.52ij.com/jishu/1706.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
