.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的多种扩展