.net core利用actionFilter实现session过期自动跳转

Posted 厦门德仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net core利用actionFilter实现session过期自动跳转相关的知识,希望对你有一定的参考价值。

利用actionFilter实现session过期自动跳转

记得以前在webfrom时代,采用重写page基类方式判断session是否过期,如何在每个页面上继承自定义重写的page类。那么在mvc或netcore中又如何实现呢?
搜索了一些方法,网上很多也采用类似webfrom重写Action或Controller的方式实现,确实可以。但同样存在一个问题,每个页面都需要去继承或者标注action的特性。

那么我们是否可以反过来思考,只需要在不需要检查的action上进行特性的标记呢?
说干就干:
自定义Filter过滤器:LoginActionFilterAttribute:Attribute, IActionFilter
继承attribute类并实现接口
全局注册
重写OnActionExecuting方法

           var user = context.HttpContext.Session.GetString("userId");
            if (user == null)
            
                context.HttpContext.Response.Redirect("/Login/Index");
            

全局注册:

       services.AddMvc(option => 
                option.Filters.Add<LoginActionFilterAttribute>();
            );

问题来了;全局注册,会导致死循环,如在登录时候Index方法 就自动跳转了或避开Index方法后登录校验时还未写入SESSION.又自动跳转。造成死循环

解决办法采用匿名filter
自定义一个匿名filter:CustomAllowAnonymousAttribute
空白即可,无需做任何事情。
我们修改刚才的方法执行前:

            if (context.ActionDescriptor.EndpointMetadata.Any(item=>item.GetType()==typeof
            (CustomAllowAnonymousAttribute))) 
            
                return;
            
            var user = context.HttpContext.Session.GetString("userId");
            if (user == null)
            
                context.HttpContext.Response.Redirect("/Login/Index");
            

然后在我们不需要校验地方(首页,登录,退出等)标记自定义的匿名特性

测试登录页面以及其他页面作业一切正常

优点:最少代码修改量。个人认为是比较好的一个解决方案之一。

以上是关于.net core利用actionFilter实现session过期自动跳转的主要内容,如果未能解决你的问题,请参考以下文章

netcore利用asp.net core actionfilter实现简单的RBAC权限过滤

netcore利用asp.net core actionfilter实现简单的RBAC权限过滤

[Asp.Net Core]NET5_ActionFilter的多种扩展

[Asp.Net Core]ActionFilter的特点

在 .net core c# 的 ExceptionFilter 中从 ActionFilter 中捕获异常

ApplicationUser在Asp.Net Core 2.0中的ActionFilter中?