• MVC之特性


    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());
            }
        }
  • 相关阅读:
    servlet 表单加上multipart/form-data后request.getParameter获取NULL(已解决)
    火狐浏览器通过配置文件锁定主页
    如何最快速的完成智慧树期末考试(有钱的大佬请绕道)记----智慧树考试生产力
    java代码发送邮箱验证码与qq邮箱smtp服务
    邮件服务器
    Android requestcode resultcode的作用
    伽卡拉他学生客户端无法运行任务管理器的解决方法
    Django自定义UserModel并实现认证和登录
    {%csrf_token%}的作用
    Producer Flow Control 和 vmQueueCursor
  • 原文地址:https://www.cnblogs.com/huanglexian/p/3622306.html
Copyright © 2020-2023  润新知