.NET MVC中登录过滤器拦截的两种方法

今天给大家介绍两种ASP中过滤器拦截的两种方法。

一种是EF 的HtppModule,另一种则是灵活很多针对MVC的特性类 Attribute

具体什么是特性类可以参考着篇文章:https://www.cnblogs.com/abc1069/p/6074171.html

在平常的练习或者项目中,整体运行流程都是从登录开始吧。过滤器的主要作用就是用户在没有进行登录操作情况下无法直接通过Url路径获取响应的数据。

过滤器顾名思义就是如此。

首先来介绍一下第一种也就是通过HttpModule的方式实现简单的登录拦截的功能。。。

  1. 创建一个普通类LoginModuleFilter,继承IHttpModule接口,因为要实现接口里面的方法。

具体代码:

public void Dispose()
        {

        }
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="context"></param>
        public void Init(HttpApplication context)
        {
            //原因:AcquireRequestState 它能获取会话信息 Session
            context.AcquireRequestState += Context_AcquireRequestState;
        }

 

此文章详细的介绍了IHttpModule接口的实现方式以及具体怎么使用:https://www.cnblogs.com/humble/p/3913078.html

在判断用户是否登录时,我们可以通过Session机制来判断用户是否进行过登录操作这一流程。关键点就是在LoginModuleFilter类中拿到Session,但是无法直接获取,那我们该怎么去做呢?

在IHttpModule中我们可以通过HttpModule.AcquireRequestState来获取会话信息。并生成Context_AcquireRequestState处理事件

 

具体代码:

 1 private void Context_AcquireRequestState(object sender, EventArgs e)
 2         {
 3             //获得应用请求
 4             HttpApplication app = sender as HttpApplication;
 5             //可以点到四个内置对象,拿到请求的http地址特定信息
 6             HttpContext context = app.Context;
 7             //获得浏览器端请求的Url路径
 8             string Url = context.Request.Url.ToString();
 9             //将请求的地址转成小写,判断是否包含/Home/login一段路径,取反则不包含
10             if (Url.ToLower().Contains("css") 
11                 || Url.ToLower().Contains("js")
12                 || Url.ToLower().Contains("jpg") 
13                 || Url.ToLower().Contains("png")
14                 || Url.ToLower().Contains("fonts"))
15             {
16 
17             }
18             else
19             {
20                 if (!Url.ToLower().Contains("/home/login"))
21                 {
22                     //若 Session 为空
23                     if (context.Session["uName"] == null)
24                     {
25                         //跳转到登录界面
26                         context.Response.Redirect("/Home/Login");
27                     }
28                 }
29             }
30         }

 

对于HttpModule,不管时运行哪一个路径都需要在此过程进行一个判断。。也就是判断用户Session是否为空,若未空,就通过重定向直接指向Home控制器下的Login方法。

第一个if条件判断是为了赋值HttpModule将所有的Css,Js,还有一些图片,字体图片一并过滤。。。

这是第一种通过HttpModule的方法实现登录拦截器功能。。。

 

第二种就是ASP.NET MVC 中的Filter权限过滤器的使用。

我这里定义了两个类,一个是专门做拦截的特性类MyFilter1Attribute,一个是专门获取Session并判断是否存在的类SessionHelper

 

这里我使用的是全局注册,此方法也可以针对不同的控制器或者Action方法通过特性类标识的方式来根据不同要求进行拦截。

这种过滤拦截器方式有多种,具体怎么去实现可以参考这篇文章:https://www.cnblogs.com/webapi/p/5669057.html

MyFilter1Attribute代码:

 

这里涉及到了MVC 中的特性类,所谓特性类简单的来说就是在MVC中各Action方法中进行标记,类似于[HttpPost]、以及Model中的模型注解。

但是这里需要特别注意的一点就是,使用标识有一个前提条件,那就是后缀必须添加上Attribute,也就是存在一个命名约定。

过滤器类命名规则:名+Attribute

//MyFilter1Attribute自定义过滤器类
    /// <summary>
    /// 过滤器类命名规则:名+Attribute
    /// 继承 ActionFilterAttribute 
    /// </summary>
    public class MyFilter1Attribute: System.Web.Mvc.ActionFilterAttribute
    {
        //实现接口方法
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //控制器名称
            string controller = filterContext.RouteData.Values["controller"].ToString();
            if (controller == "Home")
            {
                base.OnActionExecuting(filterContext);
                return;
            }
            //调用Get方法判断Session 为空 ?
            string User = SessionHelper.Get("uName");
            if (string.IsNullOrEmpty(User))
            {
                //这里构造了一个新的ActionResult
                filterContext.Result = new System.Web.Mvc.RedirectResult("/Home/Login");
                return;
            }
            else
            {
                base.OnActionExecuting(filterContext);
                return;
            }
        }
    }

下面我们来解读一下以上代码:

首先:我自定义了一个MyFilter1Attribute过滤器类,并且让它继承与ActionFilterAttribute。

实现ActionFilterAttribute的方法,你可以通过F12查看具体的元数据。

根据具体要求,我们需要实现的就是在用户直接访问路径之前将其拦截下来。。。

所以顾名思义,我们可以通过实现OnActionExecuting方法来做。

定义了一个控制器名称,用来判断用户是否是从Home控制器进行的操作。

调用SessionHelper中的Get方法将具体的键“uName”传到SessionHelper中进行判断Session是否为空。。如果为空,则直接让其重定向到登录界面。

这里需要注意的是通过 HttpContext.Current.Session来获得会话信息。

 

SessionHelper代码:

public static string Get(string uName)
        {
            if (HttpContext.Current.Session[uName] == null)
            {
                return null;
            }
            else
            {
                return HttpContext.Current.Session[uName].ToString();
            }
        }

最后一步,就是在FilterConfig文件中进行全局的注册

如果需要针对单个控制器或者Action方法进行拦截,那么只需要在对应的控制器类中或者方法中进行标识就好了。例如:

这也是特性类的一大特点。

前提要记得将全局注册的特性注释掉。。。

以上就是实现简单的登录过滤器拦截的两种方法,相比HttpModule,ASP.NET MVC 中的Filter权限过滤器更加灵活和方便。

这是本人在初入博客园的第一篇文章,主要是为了巩固一下学到的知识点也是方便以后可以常来看看哈哈哈哈哈.....

如果代码或者表述有存在错误或者不太得当欢迎指定。。。

 


 

posted @ 2020-04-09 18:02  CR7Ronaldo  Views(1308)  Comments(1Edit  收藏  举报