参考:https://www.cnblogs.com/chenyanbin/p/11397576.html
根据实际项目,发现方式二更符合使用场景。
1、在Models下建类 LoginCheckFilterAttribute.cs。代码如下:
using System.Web.Mvc;
namespace ProjectName.Models
{
/// <summary>
/// 校验用户是否登陆帮助类
/// </summary>
public class LoginCheckFilterAttribute: ActionFilterAttribute //注意继承:ActionFilterAttribute
{
/// <summary>
/// 是否校验,默认为true
/// </summary>
public bool IsChecked { get; set; }
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
//校验用户是否已登录
if (IsChecked)
{
if (filterContext.HttpContext.Session["loginInfo"] == null)
{
filterContext.HttpContext.Response.Redirect("/Login/Index");
}
}
}
}
}
2、在全局变量文件过滤器FilterConfig.cs中添加,引入Models。
实现的项目中没有啥过滤规则,写拦截器主要为了拦截未登录的操作者直接通过URL访问页面,所以直接根据提示抛出了一个空的方法,项目就可以跑起来了,同时其他功能并未受到影响。
代码如下:
using ProjectName.Models;
using System.Web.Mvc;
namespace ProjectName
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//filters.Add(new MyExceptionFilterAttribute()); //自定义的过滤规则
//校验用户是否登陆,默认为校验
filters.Add(new LoginCheckFilterAttribute() { IsChecked = true });
}
}
internal class MyExceptionFilterAttribute
{
public MyExceptionFilterAttribute()
{
}
}
}
3、在登录页面(不需要判断是否登陆的页面)中给类打上标签即可,引入Models。代码如下:
using ProjectName.Models;
namespace ProjectName.Controllers
{
[LoginCheckFilter(IsChecked = false)]
public class LoginController : Controller
{
...
}
}
碎碎念:
偶然发现连带解决了另一个小问题。项目中使用了缓存Session["loginInfo"],所以当缓存超时,页面会有红红的报错。但转念一想,缓存超时,相应也是登录信息被清空,所以 缓存超时=未登录!!!不知道这么理解对不对,但问题被解决了!开心o(* ̄▽ ̄*)ブ