登陆过滤器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcAppFilter.Filters
{
using System.Web.Mvc;
//自定义一个MyAuAttribute,让这个类继承AuthorizeAttribute类,那么这个类就成了一个登陆验证过滤器
public class MyAuAttribute : AuthorizeAttribute
{
//重写父类OnAuthorization方法。我们在这里来判断用户名Session是否为空,如果如果为空就说明用户未登陆,我们就可以让它跳转到登陆页面。
public override void OnAuthorization(AuthorizationContext filterContext)
{
/*
if (filterContext.ActionDescriptor.ActionName != "Login")
{
//如果登陆Session为空的话
if (filterContext.HttpContext.Session["Login"] == null)
{
filterContext.Result = new RedirectResult("/Home/Login");
}
}
*/
//如果你访问的控制器类上有打上[SkipCheckLogin]特性标签
//if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(LoginAttribute), false))
//{
//}
//如果你访问的Action上有打上了[SkipCheckLogin]特性标签
if (filterContext.ActionDescriptor.IsDefined(typeof(SkipCheckLoginAttribute), false))
{
//如果登陆Session为空的话
if (filterContext.HttpContext.Session["Login"] == null)
{
//第一种> 跳转到登陆页面(页面URL会变成 http://localhost:59075/Home/Login)
filterContext.HttpContext.Response.Redirect("/Home/Login");
//第二种> 或者用这种(页面URL会变成 http://localhost:59075/Home/Login)
ContentResult cr = new ContentResult();
cr.Content = "<script>alert('您尚未登陆,请登陆,页面即将跳转到登陆页面'); window.location='/Home/Login' </script>";
filterContext.Result = cr;
//第三种> 或者用这种:将视图的结果替换成Home控制器下的Login视图(页面URL不变,但是视图被替换了)
filterContext.Result = new RedirectResult("/Home/Login");
//第四种> 或者用这种方式(页面URL不变,但是视图被替换了)
ViewResult vr = new ViewResult();
vr.ViewName = "/Views/Home/Login.cshtml";
//vr.ViewName = "/Views/Shared/ToLogin.cshtml";
filterContext.Result = vr;
}
}
//base.OnAuthorization(filterContext);
}
}
}
登陆过滤器完善
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FB.CMS.WebHelper.Filters
{
using System.Web.Mvc;
using FB.CMS.Common;
using FB.CMS.IServices;
using FB.CMS.Model.ModelView;
using Autofac;
using System.Web.WebPages;
using FB.CMS.WebHelper.Attribute;
using FB.CMS.Model;
public class LoginCheckAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
string controllerNam = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//如果控制器类上有SkipCheckLoginAttribute特性标签,则直接return
if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipCheckLoginAttribute), false))
{
return;
}
//如果控action方法上有SkipCheckLoginAttribute特性标签,则直接return
if (filterContext.ActionDescriptor.IsDefined(typeof(SkipCheckLoginAttribute), false))
{
return;
}
//sysUserInfo u = filterContext.HttpContext.Session[Keys.uinfo] as sysUserInfo;
//如果控制器和action方法上都没有打SkipCheckLoginAttribute特性标签,则检查登陆Session是否存在
if (filterContext.HttpContext.Session[Keys.uinfo]==null)
{
//如果用户没有做过记住密码的功能。则跳到登陆页面
if (filterContext.HttpContext.Request.Cookies[Keys.isremember] == null)
{
filterContext.HttpContext.Response.Redirect("/admin/Login/Login");
return;
}
//获取cookie中存好的用户ID(这里之所以用AInt()这个方法来将字符串转换成int类型,
//是因为如果Cookies[Keys.isremember不存在的话,那么取到的是一个null值,如果用int.Parse(null)就会报错,
//而用AsInt()方法,即便转换不成功,也会返回一个0,这样就不会出错了
string uid = filterContext.HttpContext.Request.Cookies[Keys.isremember].Value;
int userid = uid.AsInt();
var container = CacheMgr.GetData<IContainer>(Keys.autofac); //从缓存中获取AutoFac的工作容器
IsysUserInfoServices uinfo = container.Resolve<IsysUserInfoServices>();//从容器中获取IsysUserInfoServices类实例对象
sysUserInfo userinfo = uinfo.QueryWhere(r => r.uID == userid).FirstOrDefault();//调用IsysUserInfoServices类的QueryWhere方法
if (userinfo == null)
{
//即便浏览器传递了一个Coookie[keys.isremember]过来,但是我们根据这个cookie的键得到值,
//经过数据库的查询,发现没有此用户,所以还需要跳转到登陆页面(Coookie[keys.isremember]里面保存的是用户的uId)
filterContext.HttpContext.Response.Redirect("/admin/Login/Login");
return;
}
filterContext.HttpContext.Session[Keys.uinfo] = userinfo;
}
else
{
return;
}
}
}
}
Home控制器
using MvcAppFilter.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcAppFilter.Controllers
{
public class HomeController : Controller
{
//自定义跳过检查登陆特性标签的使用
[SkipCheckLogin]
public ActionResult Index()
{
return View();
}
public ActionResult Login()
{
return View();
}
}
}
SkipCheckLoginAttribute特性类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcAppFilter.Filters
{
[AttributeUsage(AttributeTargets.Class |AttributeTargets.Method)]
public class SkipCheckLoginAttribute:Attribute
{
}
}
ToLogin视图 在这个视图里也可以做跳转到登陆页面,这个视图做的比较精美,目的是放点广告,并提示用户跳转到登陆页面
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ToLogin</title>
</head>
<body>
<div>
精美的广告......
</div>
<script>
alert("您尚未登陆,请登陆!")
window.location = '/Home/Login';
</script>
</body>
</html>