5.WebAPI的Filter-阿里云开发者社区

开发者社区> 安全> 正文

5.WebAPI的Filter

简介: 1.WebApi的Filter介绍: 大家知道什么是AOP(aspect oriented programming)吗?它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

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)如图

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

云安全开发者的大本营

其他文章