2020.10.22-MVC5过滤器(权限认证)与checkbox传值的相关问题

一、checkbox传值:通过Name属性值获取 用户选中的项数据,会序列化成数组形式传递
在这里插入图片描述
后台代码:
在这里插入图片描述


二、MVC5的权限验证AuthorizeAttribute

using Microsoft.Ajax.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Helpers;
using System.Web.Management;
using System.Web.Mvc;

namespace RM_MVC._2020._10._21.Models
{
    /// <summary>
    /// 指定空明知其或Action的访问只限于满足授权的用户
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class UserInfoAuthorizationAttribute : AuthorizeAttribute
    {
        public string loginUri { get; set; }
        //不同项目的登录Action 可能不一样 
        public UserInfoAuthorizationAttribute(string loginUrl = "~/UserInfo/Index")
        {
            this.loginUri = loginUrl;
        }
        /// <summary>
        /// 认证校验
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {


            //判断是否跳过授权过滤器
            if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
                || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
            {
                return;
            }
            else
            {
                if (filterContext.HttpContext.Session["CurrentUseInfo"] == null || !(filterContext.HttpContext.Session["CurrentUseInfo"] is Userinfo))
                {
                    //如果是Ajax请求 返回Json数据
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        //filterContext.Result = new ContentResult() { Content = "NO-请登录" };
                        //返回son字符串
                        filterContext.Result = new JsonResult() { JsonRequestBehavior = JsonRequestBehavior.AllowGet, Data = new { msg = "请登录", code = 0 } };
                    }

                    //记住用户请求的URL,登陆成功以后自动跳转至该页面
                    filterContext.HttpContext.Session["FirstUrl"] = filterContext.HttpContext.Request.Url.AbsoluteUri;

                    //如果不是Ajax,就直接获取或设置由Action返回的结果(跳转页面)
                    filterContext.Result = new RedirectResult(this.loginUri);

                }
                else
                {
                    //已有登录 略过不处理(日志。。)
                    return;
                }
            }

            //base.OnAuthorization(filterContext);
        }
    }
}

使用方式:class action 全局:
在这里插入图片描述
在这里插入图片描述
1.登录(Login)控制器或者Action不需要认证、使用AllowAnonymous特性忽略认证
在这里插入图片描述
2.只打上特性标签还远远不够、需要在你权限认证的时候,加判断。
在这里插入图片描述
3.这样用户在请求登录页面的时候不会造成死循环(无限重定向)、
在这里插入图片描述


三、Error自定义全局过滤器:
在这里插入图片描述
在这里插入图片描述
使用方式:class action 全局:
在这里插入图片描述
在这里插入图片描述
△:自定义异常处理程序能捕获哪些异常信息?

1.Action异常、没被捕获
2.Action调用Servicec服务异常(异常throw传递)
3.Action正常、View视图异常
4.权限验证时异常(Authorization)

△:自定义异常处理程序不能捕获到哪些异常信息?

1.控制器构造函数异常不能被捕获。(控制器被构造后,才有Filter)
2.访问Action时名称出错 (与Route相关、与MVC处理程序无关)

△:怎么解决这些漏网之鱼?实现可以全面捕获异常的组合?
注册Global文件里的Application_Error() 事件–全局异常处理事件函数在这里插入图片描述


四、Action过滤器:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
扩展:Action过滤器也可以使用Controller基类实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、过滤器(执行顺序)以及改变方式

如果一个Action同时应用了 Action过滤、Class过滤、全局过滤
默认由外到内–>由内到外 这个执行顺序
改变顺序---->使用Order属性 值越大 优先触发过滤事件

[ActionFilterAttribute(order = 15 )]
[ControllerFilterAttribute(order = 50 )]
[OverallFilterAttribute(order = 5 )]


六、Action(执行顺序)异常捕获 图片
在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页