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; }
        }
    }
    
  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/besos/p/14066947.html
Copyright © 2011-2022 走看看