zoukankan      html  css  js  c++  java
  • ASP.NET Core MVC 过滤器简单使用

      1.token授权过滤器

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ModelFilter.Filter
    {
        public class TokenHelper : IAuthorizationFilter
        {
            public void OnAuthorization(AuthorizationFilterContext filterContext)
            {
                string token = filterContext.HttpContext.Request.Headers["Authorization"];
                if (string.IsNullOrWhiteSpace(token))
                {
    
                    filterContext.Result = new JsonResult(new { ReturnCode = 0, Message = "身份凭证已过期,请重新登录" });
                    return;
                }
    
                if (token.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
                {
                    token = token.Remove(0, 7);
                }
               // 获得token  进行简单验证
               // if ......
                          
            }
        }
    }
    

     2.参数过滤器

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ModelFilter.Filter
    {
        public class FilterHelper: ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if (!filterContext.ModelState.IsValid)
                {
                    //获取验证失败的模型字段
                    var errors = filterContext.ModelState
                        .Where(e => e.Value.Errors.Count > 0)
                        .Select(e => e.Value.Errors.First().ErrorMessage)
                        .ToList();
    
                    var str = string.Join("|", errors);
    
                    //设置返回内容
                    var result = new
                    {
                        returnCode = 0,
                        message = str
                    };
    
                    filterContext.Result = new JsonResult(result);
                }
            }
    
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                
            }
    
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
            }
    
            public override void OnResultExecuted(ResultExecutedContext filterContext)
            {
            }
        }
    }
    

     3.异常过滤器

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ModelFilter.Filter
    {
        public class ErrorHelper:IExceptionFilter
        {
            public void OnException(ExceptionContext context)
            {
                //throw new NotImplementedException();
                // 自定义返回内容
                var ret = new
                {
                    returnCode = 0,
                    message = context.Exception.Message
                };
                context.Result = new JsonResult(ret);
            }
        }
    }
    

     4.Starup.cs配置方式

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using ModelFilter.Filter;
    
    namespace ModelFilter
    {
        public class Startup
        {
            // This method gets called by the runtime. Use this method to add services to the container.
            // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
                // 关闭netcore自动处理参数校验默认机制
                services.Configure<ApiBehaviorOptions>((o) =>
                {
                    o.SuppressModelStateInvalidFilter = true;
                });
                // 注入操作方法过滤器(全局注册)
                services.AddMvc(option => { option.Filters.Add<FilterHelper>(); });
                // 注入全局异常过滤器(全局注册)
                services.AddMvc(option => { option.Filters.Add<ErrorHelper>(); });
                // 注入授权过滤器(全局注册)
                services.AddMvc(option => { option.Filters.Add<TokenHelper>(); });
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapGet("/", async context =>
                    {
                        await context.Response.WriteAsync("Hello World!");
                    });
                    endpoints.MapControllers();
                });
            }
        }
    }
    

     5.控制器方法和参数定义

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using ModelFilter.Filter;
    
    namespace ModelFilter.Controllers
    {
        [ApiController]
        [Route("[controller]/[action]")]
        public class HomeController : Controller
        {
            [HttpGet]
            public IActionResult GetIndex([FromQuery] User user)
            {
                throw new Exception("跑出一个错误");
            }
        }
    
        public class User{
            [Required(ErrorMessage = "{0}不能为空")]
            [StringLength(5, ErrorMessage = "最大长度不能超过 5")]
            public string Userid { get; set; }
    
    
            [Required(ErrorMessage = "用户年龄不能为空")]
            [Range(1, 100, ErrorMessage = "年龄必须介于1~100之间")]
            public int Code { get; set; }
        }
    }
    
  • 相关阅读:
    vue 路由跳转返回上一级
    js中Let和Var的区别
    JS实现电话号码校验座机:区号号码、或11位手机号
    VUE 监听 对象属性值变化的三种方式
    vue中computed的用法
    elementUI中input输入框,强制输入数字,并限制输入长度
    C++中__int64用法
    WIN10计算器设计可能出现的坑
    跳转acticity
    asp.net邮件发送
  • 原文地址:https://www.cnblogs.com/besos/p/14066947.html
Copyright © 2011-2022 走看看