利用过滤器验证登录 与免登录
建一个类 CheckingLoginAttribute 继承ActionFilterAttribute
重写OnActionExecuting
里面代码:
//0.0判断action或者action所在的控制器是否贴有SkipCheckLogin标签否则要验证是否已登录
Type skiptype = typeof(SkipCheckLoginAttribute);
if (filterContext.ActionDescriptor.IsDefined(skiptype,false)||filterContext.ActionDescriptor .ControllerDescriptor.IsDefined(skiptype,false))
{
return;
}
// var container = CheckManager.GetData<IContainer>(Keys.Autofac);
//1,判断session[Keys.Uinfo]是否有值 否则提醒并跳转登录页面
if (filterContext.HttpContext.Session[Keys.Uinfo]==null)
{
//2.0先判断免登录 看浏览器是否把cookie带过来给服务器
if (filterContext.HttpContext.Request .Cookies[Keys.IsRemember]!=null)
{
//2.01获取cookie的值 此处的值就是uid 有值表示免登录
string userId = filterContext.HttpContext.Request.Cookies[Keys.IsRemember].Value;
//2.02利用uid从sysUserInfo中查出实体类对象
//首先要获取autoac的容器对象
// container = CheckManager.GetData<IContainer>(Keys.Autofac);
// IsysUserInfoBLL userinfo = container.Resolve<IsysUserInfoBLL>();
IsysUserInfoBLL userinfo = GetInstanceForInterfaceByAutofac.GetInstance<IsysUserInfoBLL>();
//int uid = int.Parse(userId);//万一有问题会报错
int uid = userId.AsInt();
var user = userinfo.QueryWhere(c => c.uID == uid).FirstOrDefault();
//判断一下啊
if (user==null)
{
ToLogin(filterContext);
}
else
{
//2.03将user对象存入session中
filterContext.HttpContext.Session[Keys.Uinfo] = user;
//将当前用户权限数据缓存中
IsysPermissListBLL perbll = GetInstanceForInterfaceByAutofac.GetInstance<IsysPermissListBLL>();
perbll.GetPermisslistByCache(user.uID);
}
}
else
{
//2,表示没有登录也没有免登录 那么就跳转到登录页面(分ajax异步请求和浏览器的导航请求两种情况)
ToLogin(filterContext);
}
}
}
/// <summary>
/// 封装方法
/// </summary>
/// <param name="filterContext"></param>
private void ToLogin(ActionExecutingContext filterContext)
{
//1,判断当前请求是否为ajax请求
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//返回一个json格式 由于这个方法在进入action方法之前 所以只需要换个视图跳转
JsonResult json = new JsonResult();
json.Data = new {status=2,msg="您未登录或是登录已失效!"};
//允许get请求
json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
filterContext.Result = json;
}
else
{
//返回到登录视图直接content用户体验不好 在Areas admin view shared里加一个视图 进行跳转并提示
ViewResult view = new ViewResult();
view.ViewName = "/Areas/admin/Views/Shared/NoLogin.cshtml";
filterContext.Result = view;
}
}
添加到全局过滤器
在App_Start 里的FilterConfig 里面注册
filters.Add(new CheckingLoginAttribute());//注册登录验证 先注册的先执行
在登录页面 与 验证码的 action方法上贴 自定义标签 SkipCheckLoginAttribute 跳过登录验证
要先建一个这样的自定义标签SkipCheckLoginAttribute
/// <summary>
/// 如果在类或action方法中贴此标签表示跳过登录验证
/// </summary>
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
public class SkipCheckLoginAttribute:Attribute
{
}
-------------------------------------------
模拟免登录
在 创建Autofac 容器对象的时候 存储在 内存中 因为 后面要拿里面的 实体类对象
建一个 专门的类 用来读 与写 缓存
/// <summary>
/// 封装读 写缓存的
/// </summary>
public class CheckManager
{
/// <summary>
/// 永久缓存Autofac 容器 当IIS进程重启以后 缓存才消失 而在启动又会再执行Application_Start() 又会缓存Autofac容器
/// </summary>
/// <param name="key"></param>
/// <param name="val"></param>
public static void SetData(string key,object val)
{
//没有过期时间的缓存
HttpRuntime.Cache[key] = val;
}
/// <summary>
/// 获取缓存中的autofac 容器泛型方法 根据key 或取指定类型的对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static T GetData<T>(string key)
{
return (T)HttpRuntime.Cache[key];
}
/// <summary>
/// 移除缓存
/// </summary>
/// <param name="key"></param>
public static void Remove(string key)
{
HttpRuntime.Cache.Remove(key);
}
}
在 创建Autofac 容器类对象 时候 就 调用 上面方法 来缓存 Autofac 容器类对象
//5.0 创建一个autofac的正真容器
IContainer container = bulider.Build();
//aotufac容器有一个方法在后面验证登录取cookie对象用
//aotufac容器有意个方法Resolve(),只需要提供一个借口名称 就能以接口的形式返回实现了这个接口的子类对象
//IsysUserInfoBLL userinfo= container.Resolve<IsysUserInfoBLL>();
//5.01将容器存入缓存里 (全局缓存)方便后面取出来使用
CheckManager.SetData(Keys.Autofac, container);
//获取autofac容器对象
// CheckManager.GetData<IContainer>(Keys.Autofac);