MVC之ActionFilterAttribute自定义属性
ActionFilterAttribute里有OnActionExecuting方法,跟Controller一樣, 同是抽象實(shí)現(xiàn)了IActionFilter接口。
// 登錄認(rèn)證特性 public class AuthenticationAttribute : ActionFilterAttribute {public override void OnActionExecuting(ActionExecutingContext filterContext){if (filterContext.HttpContext.Session["username"] == null)filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } });base.OnActionExecuting(filterContext);} }使用方法如下:
public class HomeController : Controller { [Authentication] public ActionResult Index(){return View();} }如果你想針對(duì)整個(gè)MVC項(xiàng)目的所有Action都使用此過(guò)濾器,步驟如下:
a. 確保Global.asax.cs的Application_Start方法中包含如下紅色行:
public class MvcApplication : System.Web.HttpApplication {protected void Application_Start(){AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);} }b. 在FilterConfig.cs文件中注冊(cè)相應(yīng)的特性過(guò)濾器:
public class FilterConfig {public static void RegisterGlobalFilters(GlobalFilterCollection filters){filters.Add(new HandleErrorAttribute()); filters.Add(new AuthenticationAttribute());} }如此,通過(guò)過(guò)濾器的方法實(shí)現(xiàn)認(rèn)證和授權(quán)
?
另有不推薦的方法實(shí)現(xiàn)授權(quán)功能,自定義一個(gè)控制器類(lèi),再通過(guò)繼承這個(gè)控制器類(lèi):
1、繼承Controller:
1.1?參考WebForm使用方式,在派生類(lèi)里自己添加了驗(yàn)證方法,然后在每個(gè)Action方法里調(diào)用。
派生類(lèi)如下:
public class AuthenticationControllor : Controller {public bool Validate(){if (Session["username"] == null)return false;elsereturn true;}public ActionResult RedirectLogin(bool redirect = true){if (redirect)return RedirectToAction("Login", "Home", new { from = Request.Url.ToString() });elsereturn RedirectToAction("Login", "Home");} }?
使用類(lèi)如下:
public class HomeController : AuthenticationControllor {public ActionResult Index(){if (!Validate())return RedirectLogin();return View();} }?
1.2?改進(jìn)上面的使用,通過(guò)用Controller里有一個(gè)OnActionExecuting方法,此方法是在Action之前執(zhí)行的,非常方便。
派生類(lèi)如下:
public class AuthenticationControllor : Controller {protected override void OnActionExecuting(ActionExecutingContext filterContext){if (filterContext.HttpContext.Session["username"] == null)filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } });base.OnActionExecuting(filterContext);} }?
使用類(lèi)如下:
// 不需要多寫(xiě)任何邏輯代碼就能判斷是否登錄并跳轉(zhuǎn) public class HomeController : AuthenticationControllor {public ActionResult Index(){ return View();} }?
/// <summary>/// 權(quán)限攔截/// </summary>[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class PermissionFilterAttribute : ActionFilterAttribute{/// <summary>/// 權(quán)限攔截/// </summary>/// <param name="filterContext"></param>public override void OnActionExecuting(ActionExecutingContext filterContext){if (!this.CheckAnonymous(filterContext)){//未登錄驗(yàn)證if (SessionHelper.Get("UserID") == null){//跳轉(zhuǎn)到登錄頁(yè)面filterContext.RequestContext.HttpContext.Response.Redirect("~/Admin/User/Login");}}}/// <summary>/// [Anonymous標(biāo)記](méi)驗(yàn)證是否匿名訪問(wèn)/// </summary>/// <param name="filterContext"></param>/// <returns></returns>public bool CheckAnonymous(ActionExecutingContext filterContext){//驗(yàn)證是否是匿名訪問(wèn)的Actionobject[] attrsAnonymous = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AnonymousAttribute), true);//是否是Anonymousvar Anonymous = attrsAnonymous.Length == 1;return Anonymous;}}通過(guò)寫(xiě)一個(gè)BaseController來(lái)進(jìn)行權(quán)限的驗(yàn)證,這樣就不需要所有需要驗(yàn)證的Controller加標(biāo)注了,當(dāng)然BaseController還可以增加其他通用的處理
/// <summary>/// Admin后臺(tái)系統(tǒng)公共控制器(需要驗(yàn)證的模塊)/// </summary> [PermissionFilter]public class BaseController:Controller{}?
?
?其它文章 :
http://www.cnblogs.com/sunkaixuan/p/4908773.html
總結(jié)
以上是生活随笔為你收集整理的MVC之ActionFilterAttribute自定义属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 制作openstack Centos镜像
- 下一篇: java 浅拷贝和深拷贝