1.创建自定义特性
类继承于Attribute类,并且自定义特性的命名规则于:XXXXAttriubute
1 /// <summary> 2 /// 跳过登陆 标记:任何类 或者方法 有此标记,则不再验证是否有Session 3 /// </summary> 4 public class SkipLoginAttribute:Attribute 5 { 6 }
2.给方法或类写上特性
可以写上多个特性,以逗号分开
[HttpGet,MyAttr.SkipLogin] public ActionResult Login() { //Request.HttpMethod=="get" return View(); }
3.创建自定义全局过滤器
在Filters文件夹里面写上自定义过滤器
/// <summary> /// 自定义 Action 过滤器 /// </summary> public class IsLoginAttribute : ActionFilterAttribute { /// <summary> /// 在当前mvc网站的 任何一个 控制器类 的 任何一个 Action方法被请求时 都会先调用 OnActionExecuting /// </summary> /// <param name="filterContext">过滤器上下文对象</param> public override void OnActionExecuting(ActionExecutingContext filterContext) { //0.检查 被请求 的 类 或者 方法 是否有 MyAttr.SkipLogin 标记,如果有,则不需要验证 Type skipLoginType = typeof(MyAttr.SkipLoginAttribute); //0.1检查 被请求的【方法-ActionDescriptor】是否有 贴 标记 if (!filterContext.ActionDescriptor.IsDefined(skipLoginType, false) //ActionDescriptor 是被请求的方法描述器 //0.2检查 被请求的 方法所在的【控制器类-ControllerDescriptor】是否 有标记 && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(skipLoginType, false)) { //1.判断用户Session是否存在,如果不存在,则跳转到登陆页面 if (filterContext.HttpContext.Session == null || filterContext.HttpContext.Session["uinfo"] == null) { //filterContext.HttpContext.Response.Redirect("/user/login?nologin"); //filterContext.Result = new RedirectResult("/user/login?nologin"); //当在过滤器中 为 过滤器上下文的 Result属性赋值后,之后的 Action方法执行 等操作都会 被 取消! //而是 在这个 过滤器中 直接 生成 响应报文 filterContext.Result = new ContentResult() { Content = "<script>alert(‘对不起,你好像木有登陆哦~~~~~~‘);window.location=‘/user/login‘;</script>", ContentType = "text/html" }; } } } }
4.添加全局过滤器
在APP_Start文件夹里面的过滤器配置类上,添加自定义过滤器
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //添加 自定义 全局过滤器 filters.Add(new P01MVC.Filters.IsLoginAttribute()); } }