登录状态验证是web系统中最常见的一种权限,接下来我们一起来看看怎么做
这里将会使用MVC Action级别的过滤器。
规范书写代码,我们先创建一个过滤器的文件夹 ,文件夹里面添加一个londingFilter的普通类:
类里面使用 Action级别的过滤器要引用using System.Web.Mvc;命名空间和继承 IActionFilter类
using System.Web.Mvc;
public class londingFilter : IActionFilter
{
}
接下来就是实现接口的方法(tips不实现接口IActionFilter可是会报错的哦)
直接点击实现接口就OK了。会自动帮你生成代码非常的人性化
生成的代码如下:
public class londingFilter : IActionFilter
{
//控制器执行之后执行
public void OnActionExecuted(ActionExecutedContext filterContext)
{
throw new NotImplementedException();
}
//控制器执行之前执行
public void OnActionExecuting(ActionExecutingContext filterContext)
{
throw new NotImplementedException();
}
}
我们要实现的是没登录就不能访问其他页面那么访问规则就是:控制器——页面;
即:我们在控制器执行之前执行里面填写为登录的代码:
//获取登录时候的session
Users users = filterContext.HttpContext.Session["user"] as Users;
if(users==null) {
//为空就返回登录页面
filterContext.Result = new RedirectResult("/londing/index");
}
接下来配置一下文件:
里面添加一下那你刚刚写的类
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new londingFilter());
}
这个时候运行你会发现一个惊喜:
这是什么情况:
这是由于你的疏忽造成的,你想,当你没有登录时,检测到session为空,所以定向到了登录,登录的action被捕获,本应该到登录页面,但是OnActionExecuting要先执行,于是进入死循环了
解脱这个死循环这个时候就需要跳过登录的Action级别的过滤器就OK啦
方法如下
//filterContext.ActionDescriptor.ControllerDescriptor.ControllerName可以获取控制器的name
//如果name==登录页面的时候
if (filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower() == "londing")
{
return;
}
Users users = filterContext.HttpContext.Session["user"] as Users;
if(users==null) {
filterContext.Result = new RedirectResult("/londing/index");
}
这样就OK了: