今天给大家介绍两种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处理事件

具体代码:

 private void Context_AcquireRequestState(object sender, EventArgs e)
{
//获得应用请求
HttpApplication app = sender as HttpApplication;
//可以点到四个内置对象,拿到请求的http地址特定信息
HttpContext context = app.Context;
//获得浏览器端请求的Url路径
string Url = context.Request.Url.ToString();
//将请求的地址转成小写,判断是否包含/Home/login一段路径,取反则不包含
if (Url.ToLower().Contains("css")
|| Url.ToLower().Contains("js")
|| Url.ToLower().Contains("jpg")
|| Url.ToLower().Contains("png")
|| Url.ToLower().Contains("fonts"))
{ }
else
{
if (!Url.ToLower().Contains("/home/login"))
{
//若 Session 为空
if (context.Session["uName"] == null)
{
//跳转到登录界面
context.Response.Redirect("/Home/Login");
}
}
}
}

对于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权限过滤器更加灵活和方便。

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

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

												

.NET MVC中登录过滤器拦截的两种方法的更多相关文章

  1. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  2. 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)

    Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...

  3. 在shell script中进行数值运算的两种方法

    方法1:使用"$((计算式))"的方式进行数值运算,不需要使用declare命令显示声明数值型变量来存储计算结果: 方法2:使用declare命令配合"-i"选 ...

  4. Android中Intent传递对象的两种方法(Serializable,Parcelable)

    今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...

  5. 在List中找出最大值的两种方法

    先说需求:找出一个对象List中,某个属性值最大的对象. 1.定义对象 private class A { public int ID { get; set; } public string Name ...

  6. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  7. [转]Android中Intent传递对象的两种方法(Serializable,Parcelable)

    http://blog.csdn.net/xyz_lmn/article/details/5908355 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种 ...

  8. Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!

    [转][原文] 大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object); ...

  9. Oracle中spool命令实现的两种方法比较

    ---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...

随机推荐

  1. Java 14 发布了,可以扔掉Lombok了?

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...

  2. delphi真正实现延时暂停功能

    用delphi怎么实现延时功能?在delphi中有一个sleep()函数是用来暂停线程的,使用了它好像和死掉了似得,不好用,这么简单的延时动作用Timer控件有显得复杂了.下面给大家分享一个真正好用的 ...

  3. setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop

    笔者以前面试的时候经常遇到写一堆setTimeout,setImmediate来问哪个先执行.本文主要就是来讲这个问题的,但是不是简单的讲讲哪个先,哪个后.笼统的知道setImmediate比setT ...

  4. 面试官:说说你对css效率的理解

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 大家的支持是我创作的动力. 选择器的优先级 众所周知,选择器是有权重 ...

  5. django之forms组件,cookie&session

    forms组件 先自己实现注册功能,并且对用户输入的信息加限制条件如果用户输入的信息不符合条件,前端展示报错信息 from django.shortcuts import render,HttpRes ...

  6. 题解 P2642 【双子序列最大和】

    前言 其实这道题的关键就是在于预处理,其方法类似于 合唱队形 正文 求最大子段和 要想求出双子序列最大和,首先我们要会求出最大子段和 最大子段和的求值方法很简单 定义 \(f_i\) 为以第 \(i\ ...

  7. 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...

  8. Linux中cache和buff的区别

    两者都是:缓冲区 cache是存在于cpu和内存之间的缓冲区,存放的是从disk上读取到的数据 buff是用于存放要输出到块存储的数据 清除缓冲的方法 [root@DD-Server-9F ~]# e ...

  9. 为什么要在离线A/B测试中使用贝叶斯方法

    当涉及到假设检验时,贝叶斯方法可以取代经典的统计方法.这里将使用web分析的具体案例来演示我们的演示. 贝叶斯方法在经典统计中的重要性在此链接. https://towardsdatascience. ...

  10. CSS常用属性之选择器

    css选择器 序号 选择器 例子 例子描述 1 .class .intro 选择class="intro"的所有元素 2 #id #firstname 选择id="fir ...