ASP.NET MVC的Action拦截器(过滤器)ActionFilter

有时项目要进行客户端请求(action)进行拦截(过滤)验证等业务,可以使用拦截器进行实现,所谓的action拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.FilterAttribute)和一个接口(System.Web.Mvc.IActionFilter),至于什么是拦截器这里就不说了,网上很多关于这方面文章。

假如现在有这样的一个需求:某个action需要登录才能进行访问,可以使用action属性拦截器进行拦截进行验证

多余的不说了直接上代码

写一个拦截器类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6
 7 namespace AttributeDemo.Common
 8 {
 9     /// <summary>
10     /// Action拦截器
11     /// </summary>
12     public class ActionFilterAttribute : System.Web.Mvc.FilterAttribute, System.Web.Mvc.IActionFilter
13     {
14         #region 属性
15         /// <summary>
16         /// 记录是否登陆
17         /// </summary>
18         public bool IsLogin { get; set; }
19         #endregion
20
21         #region 执行action后执行这个方法
22         /// <summary>
23         /// 执行action后执行这个方法
24         /// </summary>
25         /// <param name="filterContext"></param>
26         void System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
27         {
28
29         }
30         #endregion
31
32
33         #region 执行action前执行这个方法
34         /// <summary>
35         /// 执行action前执行这个方法
36         /// </summary>
37         /// <param name="filterContext"></param>
38         void System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
39         {
40
41             if (!this.IsLogin)  //未登陆 重定向 到登陆页面
42             {
43                 if (filterContext.HttpContext.Request.IsAjaxRequest())   //判断是否ajax请求
44                 {
45
46                     filterContext.Result = new System.Web.Mvc.JsonResult() { Data = new { statusCode = 301 }, ContentEncoding = System.Text.Encoding.UTF8, JsonRequestBehavior = JsonRequestBehavior.AllowGet, ContentType = "json" };
47                     return;
48                 }
49                 else  //验证不通过
50                 {
51                     //filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "ActionFilterTest", action = "Login" }));  //重定向
52                     //filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }));   //重定向
53
54                     //filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }));    //重定向
55
56                     //filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }),true);  //重定向
57
58                     filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("MyRoute", new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }), true);    //重定向
59                     return;
60                 }
61
62             }
63
64         }
65         #endregion
66
67     }
68 }

请求的控制器类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6
 7 namespace AttributeDemo.Controllers
 8 {
 9     /// <summary>
10     /// 测试Action拦截器
11     /// </summary>
12     public class ActionFilterTestController : Controller
13     {
14         //
15         // GET: /ActionFilterTest/
16
17         /// <summary>
18         /// 测试action拦截器
19         /// </summary>
20         /// <returns></returns>
21         [AttributeDemo.Common.ActionFilter(IsLogin = false)]
22         public ActionResult Test()
23         {
24             return View();
25         }
26
27
28         public ActionResult Login()
29         {
30             return View();
31         }
32
33         [AttributeDemo.Common.ActionFilter(IsLogin = true)]
34         public ActionResult Index()
35         {
36             return View();
37         }
38     }
39 }

Global.asax类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7
 8 namespace AttributeDemo
 9 {
10     // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
11     // 请访问 http://go.microsoft.com/?LinkId=9394801
12
13     public class MvcApplication : System.Web.HttpApplication
14     {
15         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
16         {
17             filters.Add(new HandleErrorAttribute());
18         }
19
20         public static void RegisterRoutes(RouteCollection routes)
21         {
22             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
23
24             routes.MapRoute(
25                 "Default", // 路由名称
26                 "{controller}/{action}/{id}", // 带有参数的 URL
27                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
28             );
29             routes.MapRoute(
30                 "MyRoute", // 路由名称
31                 "{controller}/{action}/{id}", // 带有参数的 URL
32                 new { controller = "ActionFilterTest", action = "Login", id = UrlParameter.Optional } // 参数默认值
33             );
34         }
35
36         protected void Application_Start()
37         {
38             AreaRegistration.RegisterAllAreas();
39
40             RegisterGlobalFilters(GlobalFilters.Filters);
41             RegisterRoutes(RouteTable.Routes);
42         }
43     }
44 }
时间: 2024-12-29 07:46:58

ASP.NET MVC的Action拦截器(过滤器)ActionFilter的相关文章

asp.net mvc中的拦截器

在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器,所谓的拦截器也没有什么的,只是写一个类,继承另一个类和一个接口,顺便实现接口里面的方法而以拉!下面我们一一实现! public class ExceptionFillters : FilterAttribute,IExceptionFilter    {        //发生异常时会执行这段代码        public void OnException(ExceptionContex

Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filter这种方式可以实现Bean预处理.后处理. 比如注入FilterRegistrationBean,然后在这个Bean上传递自己继承Filter实现的自定义Filter进入即可. 而Spring MVC也有拦截器,不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. Spring MVC提供的org.springframework.web.servlet.handler.HandlerInt

EntityFramework6.0的Sql读写分离拦截器 和 MVC的 Action拦截器 对比

EF的DbCommandInterceptor类 拦截: EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我们更加方便的了解到EF运行时的一些信息,当然我们最想看的还是EF生成的Sql语句,话不多讲,开始干吧; class EFIntercepterLogging : DbCommandInterceptor { private readonly

ASP.NET MVC 异常Exception拦截器Fillter

异常信息的处理在程序中非常重要, 在asp.net mvc中提供异常属性拦截器进行对异常信息的处理,异常拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.FilterAttribute)和一个接口(System.Web.Mvc.IExceptionFilter),实现接口里面OnException方法. 代码实例: 异常拦截器类: 1 using System; 2 using System.Collections.Generic; 3 using System.Li

ASP.NET MVC Filters 4种默认过滤器的使用【附示例】

http://www.cnblogs.com/oppoic/p/mvc_authorization_action_result_exception_filters.html ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响应内容,只响应特定内容给那些有特定权限的用户,过滤器理论上有以下功能: 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地

ASP.NET MVC的Action Filter

一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以应用到Controller Action(或者是整个controller)上的属性(Attribute),改变Action执行的行为,当应用于整个Controller上时,Controller上的所有Action都应用了同样设置的Action. 使用Action Filter 可以处理缓存. 验证和

spring mvc 能过拦截器记录请求数据和响应数据

spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据,只能通过Aspect处理,以下是实现此需要的代码 package com.qmtt.config; import java.util.Arrays; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annot

ASP.NET MVC 主要的四种过滤器和三种具体实现类

原文:ASP.NET MVC 主要的四种过滤器和三种具体实现类 4种常用过滤器(IAuthrorizationFilter.IActionFilter.IResultFilter.IExceptionFilter) 和 3种具体实现类(AuthorizeAttribute.ActionFilterAttribute(Action + Result).HandleErrorAttribute) (图片可放大) 原文地址:https://www.cnblogs.com/lonelyxmas/p/10

spring mvc 方法注解拦截器

应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域. python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理 先看一个实例,使用@access_required拦截: @api.route('/post_apply') @access_required def apply():     "&q