• 利用过滤器验证登录 与免登录


    利用过滤器验证登录 与免登录

    建一个类 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);

    人的本事不是与生俱来的,不是你掌握了多少,而是当你面对一个未知问题的时候,你能用多少时间来掌握!
  • 相关阅读:
    haproxy 基于 cookie 的会话保持
    haproxy 透明代理
    haproxy tcp keepalive
    haproxy 支持 websocket
    python 中给文件加锁
    使用python生成二维码
    python中的uuid简介
    django建表报错
    pip安装第三方包PIL失败
    python获取mac地址的方法
  • 原文地址:https://www.cnblogs.com/dianshen520/p/4349152.html
Copyright © 2020-2023  润新知