利用過濾器驗證登陸 與免登陸html
建一個類 CheckingLoginAttribute 繼承ActionFilterAttributeajax
重寫OnActionExecutingjson
裏面代碼:瀏覽器
//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;
}
}服務器
添加到全局過濾器cookie
在App_Start 裏的FilterConfig 裏面註冊session
filters.Add(new CheckingLoginAttribute());//註冊登陸驗證 先註冊的先執行異步
在登陸頁面 與 驗證碼的 action方法上貼 自定義標籤 SkipCheckLoginAttribute 跳過登陸驗證ide
要先建一個這樣的自定義標籤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);