今天给大家介绍两种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. search(1)- elasticsearch结构概念

    上篇提到选择了elasticsearch ES作为专业化搜索引擎的核心,这篇讨论一下ES的基本结构和应用概念.首先,从硬结构方面来讲:ES是在一个集群(cluster)环境里运行的,所以ES应该具备高 ...

  2. ajax3

    json json:JavaScript对象表示方法(JavaScript object notation) json:是存储和交换文本信息的语法,类似与xml.他使用键值对的方式来组织,易于人们阅读 ...

  3. Cinemachine中噪音的应用

    两种默认产生噪音的方式 Nosie阶段的Component   Component在流水线中主要通过MuteCameraState来处理对State的计算.   对于Noise类型的Component ...

  4. DOTNET CORE源码分析之ServiceDescriptor

    ServiceDescriptor在.net core中的作用就是DI中注入服务元素的描述.每一个元素核心内容部分包括需要注入的服务元素的类型ServiceType,它对应的接口(如果有的话)Impl ...

  5. AspNetCore3.1_Secutiry源码解析_5_Authentication_OAuth

    title: "AspNetCore3.1_Secutiry源码解析_5_Authentication_OAuth" date: 2020-03-24T23:27:45+08:00 ...

  6. git常用命令学习配详细说明

    原文链接 把当前目录变成Git可以管理的仓库 git init 查看仓库当前的状态 git status 添加新/变动文件 git add <文件名> // 添加某个新文件(目录) git ...

  7. Quantitative Proteomics of Enriched Esophageal and Gut Tissues from the Human Blood Fluke Schistosoma mansoni Pinpoints Secreted Proteins for Vaccine Development (解读人:张聪敏)

    文献名:Quantitative Proteomics of Enriched Esophageal and Gut Tissues from the Human Blood Fluke Schist ...

  8. 【python 数据结构】相同某个字段值的所有数据(整理成数组包字典的形式)

    class MonitoredKeywordMore(APIView): def post(self, request): try: # 设置原生命令并且请求数据 parents_asin = str ...

  9. Jmeter之JSON提取器应用

    在接口测试中有一个这样的场景:登录之后,需要进行昵称修改,怎么实现? 首先我们分别看下登录.昵称修改的接口说明: 以上业务中补充一点,昵称修改,还需要添加请求头Authorization传登录获取的t ...

  10. cisco应用

    1.修改VLAN show arp:查看设备的ip地址和mac地址的对应关系,一般查看的是设备ARP缓存 show mac-address-table:查看各端口所学习到的MAC show ip ar ...