过去的过去,往往对于一种问题有一个很直观的解决方法,如,判断用户是否登陆,判断用户session是否为空,一般会这个写在页面中:
if(HttpContext.Session.IsNewSession)
{
// go to Logon
}
每个需要验证的页面都要这样去写同样的代码,这样的程序是我们不提供的,因为它重复了自己。
当.net出现Attribute之后,MVC出现了之后,改变了这一切,如果希望判断这个页面的访问理否需要登陆或者其它权限,只需要写类似这样的代码即可:
[UserAuthentication(UserToUrlEnum = UserToUrlEnum.Login)]
public ActionResult RegisterRedirect()
{
// code
}
而一般来说,我们的UserAuthentication这个类,我们下文称为过滤器,一般是这样来定义的:
namespace _20110711MVC3的学习.Filter
namespace _20110711MVC3的学习.Filter
{
/// <summary>
/// 验证类型列举
/// </summary>
public enum UserToUrlEnum
{
/// <summary>
/// 登录
/// </summary>
Login,
/// <summary>
/// 注册
/// </summary>
Register,
/// <summary>
/// 认证
/// </summary>
Certificate,
}
/// <summary>
/// 用户验证过滤器
/// </summary>
public class UserAuthentication : AuthorizeAttribute
{
const string DOMAIN = "http://www.test.com";
public UserToUrlEnum UserToUrlEnum { get; set; }
/// <summary>
/// 构造函数
/// </summary>
public UserAuthentication()
{
this.UserToUrlEnum = UserToUrlEnum.Login;
}
/// <summary>
/// 执行前验证
/// </summary>
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Session.IsNewSession && !ClientHelper.Current.HasUser)
{
switch (this.UserToUrlEnum)
{
case UserToUrlEnum.Login:
{
VCommons.Http.CookieHelper.Write("return_page",
HttpContext.Current.Request.Url.ToString());
HttpContext.Current.Response.Redirect(DOMAIN +
"/Register/Login", true);
}
break;
case UserToUrlEnum.Register:
{
filterContext.HttpContext.Response.Redirect(DOMAIN +
"/Register/Register", true);
}
break;
}
}
else if (this.UserToUrlEnum == UserToUrlEnum.Certificate)
{
filterContext.HttpContext.Response.Redirect(DOMAIN + "/Register/Certificate");
}
}
}
}
小知识:attribute可以加在类的上面,也可以加在方法的上面,根据实际情况而定。
作者:仓储大叔,张占岭,
荣誉:微软MVP