asp.net mvc框架之Filter的使用
1.四种Filter
在asp.net mvc中提供了四种Filter(过滤器)接口实现了这种AOP机制:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。
a.IAuthorizationFilter:在每个Action被执行前执行OnAuthorization方法,一般用来检查当前用户是否具有Action的执行权限。
b.IActionFilter:在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法。和IAuthorizationFilter的区别在于IAuthorzationFilter在IActionFilter之前执行。
c.IResultFilter:在每个ActionResult的前后执行IResultFilter。
d.IExceptionFilter:当Action执行发生未处理异常的时候执行OnException方法。
定义的类可以在Global总GlobalFilters.Filters.Add(new XXXFilter());的方式添加为全局的过滤器。
IAuthorizationFilter接口的使用
登录权限案例
1.定义两个控制器,登录过滤器(LoginController)、登录成功后的过滤器(MainController)
public class LoginController : Controller { // GET: Login public ActionResult Index() { //请求登录界面 return View(); } //提交登录 public ActionResult Login(string txtName,string txtPwd) { if (txtName=="admin"&&txtPwd=="123") { Session["User"] = txtName; return Content("登录成功!" + Session["User"]); } return Content("登录失败"); } }
//登录成功后才能访问 public class MainController : Controller { // GET: Main public ActionResult Index() { return Content("欢迎登录!"+Session["User"]); } public ActionResult Success() { return Content("主界面"+Session["User"]); } }
<html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <form action="~/Login/Login" method="post"> <input type="text" name="txtName" /><br/> <input type="text" name="txtPwd" /><br/> <input type="submit" value="登录"/> </form> </div> </body> </html>
2.定义实现IAuthorizationFilter接口的类
public class CheckLoginFilter : IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { //获取控制器名字 string controllerName=filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; //获取Action方法的名字 string actionName = filterContext.ActionDescriptor.ActionName; if (controllerName.ToLower()=="Login".ToLower()&&(actionName.ToLower()=="Login".ToLower()||actionName.ToLower()=="Index".ToLower())) { //什么都不做 } else { if (filterContext.HttpContext.Session["User"]==null) { ContentResult contentResult = new ContentResult(); contentResult.Content = "没有登录!"; //当执行filterContext.Result后,url中没有权限的路径就无法执行Action的方法了,就是阻止了没有权限的Action方法 filterContext.Result = contentResult; } } } }
重定向:filterContext.Result = new RedirectResult("/login/index");或filterContext.HttpContext.Response.Redirect("/login/index");
第二个重定向不建议使用
3.在Global中添加GlobalFilters.Filters.Add(new CheckLoginFilter());
IExceptionFilter接口的使用
用法和IAuthorizationFilter接口用法一致,捕获异常:Exception ex= filterContext.Exception;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?