zoukankan      html  css  js  c++  java
  • 5.WebAPI的Filter

    1.WebApi的Filter介绍:

    大家知道什么是AOP(aspect oriented programming)吗?它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP(object oriented programming)编程的一种补充。OOP是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系;AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。AOP是使用切面(aspect)将横切关注点模块化,OOP是使用类将状态和行为模块化。在OOP的世界中,程序都是通过类和接口组织的,使用它们实现程序的核心业务逻辑是十分合适。但是对于实现横切关注点(跨越应用程序多个模块的功能需求)则十分吃力,比如日志记录,权限验证,异常拦截等。而Filter恰好体现的AOP思想(也可以说是一夫当关万夫莫开了)。

    2.Filter的功能主要有:

    (1)验证用户是否登录,如果用户没有登录,系统直接跳转到登录页面。

    (2)权限控制。

    (3)记录日志。

    (4)异常处理。

    3.Filer权限控制实现:

    项目结构如图

     (1)创建一个webapi项目并添加控制器

    public class LoginController : ApiController
        {
            [HttpGet]
            public string ToLogin(string username)
            {
                return username+",你好登录成功!";
            }
        }
    View Code

    (2)添加MyAuthorFilter类

    public class MyAuthorFilter : IAuthorizationFilter
        {
            public bool AllowMultiple
            {
                //get { throw new NotImplementedException(); }
                get { return true; }
            }
            public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
            {
                IEnumerable<string> values;
                if (actionContext.Request.Headers.TryGetValues("UserName", out values))
                {
                    string userName = values.FirstOrDefault();
                    if (userName != "ych")
                    {
                        return new
                    HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
                    }
                }
                else
                {
                    return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
                }
                return await continuation();
            }
    
    
        }
    View Code

    (3)设置路由保证被注册

    public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
                config.Filters.Add(new MyAuthorFilter());
            }
    View Code

    请求结果:

    4.Filer异常处理实现:

    项目结构如图

     (1)创建一个webapi项目并添加控制器

    public class LoginController : ApiController
        {
            [HttpGet]
            public string ToLogin(string username)
            {
                throw new Exception("抛异常," + username);
            }
        }
    View Code

    (2)添加MyExceptionFilter类

    public class MyExceptionFilter : IExceptionFilter
        {
            //public bool AllowMultiple=>true;
            public bool AllowMultiple
            {
                get { return true; }
            }
            public async Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
            {
                Exception ex = actionExecutedContext.Exception;
            }
        }
    View Code

    (3)设置路由保证被注册

    public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
                config.Filters.Add(new MyExceptionFilter());
            }
    View Code

    (4)用postman请求(http://localhost:43417/api/Login/tologin?username=qq)如图

    这样就讲完了,你可以自己将异常什么的记录日志哦,活学活用才是硬道理!

  • 相关阅读:
    Pandas: 如何将一列中的文本拆分为多行? | Python
    Python项目实战:福布斯系列之数据采集
    Python: Pandas运算的效率探讨以及如何选择高效的运算方式
    Pandas数据处理实战:福布斯全球上市企业排行榜数据整理
    从历史来看印度的裂痕和隐忧 | 阅览群书
    Python库:序列化和反序列化模块pickle介绍
    无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
    spring 问题笔记
    java 大量数据处理问题记录
    spring mvc 整合swagger
  • 原文地址:https://www.cnblogs.com/jiyuwu/p/9214723.html
Copyright © 2011-2022 走看看