今天给大家介绍两种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进阶专题(四) 设计模式之工厂模式

    前言 ​ 今天开始我们专题的第三课了,开始对设计模式进行讲解,本章节介绍:了解设计模式的由来,介绍设计模式能帮我们解决那些问题以及剖析工厂模式的历史由来及应用场景.本章节参考资料书籍<Sprin ...

  2. 谈谈SQL优化

    写SQL是学习数据库必须掌握的非常重要的技能之一.在学习过程当中,我们会尝试写各种各样满足需求的SQL语句.在实际项目中,优秀的SQL语句和普通的SQL语句的执行速度差别非常大.对于一个数据量很大的系 ...

  3. Docker基本概念及架构

    一.Docker基本概念 Docker是一个开源的容器引擎,基于Go 语言并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  4. 工作了这么长时间,是不是非用macbook pro不可呢?

    连续奋战了二十多天,肉眼可见自己的状态一天不如一天.总觉得自己是不是该放下一切好好休息两天,但是理智又告诉我不能停.不能停. 既然不能停,那就把之前攒下的文章写一写吧. 什么是macbook pro ...

  5. MySQL笔记(5)-- SQL执行流程,MySQL体系结构

    MySQL的体系结构,可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程:Server层包括连接层.查询缓存.分析器.优化器.执行器等,涵盖MySQL的大多数核心服务功能,以及所有 ...

  6. 手动实现AJAX

    AJAX 每日更新前端基础,如果觉得不错,点个star吧

  7. 答应我,不会这些概念,简历不要写 “熟悉” zookeeper

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...

  8. 强化学习之三:双臂赌博机(Two-armed Bandit)

    本文是对Arthur Juliani在Medium平台发布的强化学习系列教程的个人中文翻译,该翻译是基于个人分享知识的目的进行的,欢迎交流!(This article is my personal t ...

  9. 解决python3使用cx_Freeze打包成exe后不能运行

    我使用的是python3.4,在使用cx_Freeze打包成exe后发现有些打包后程序能够运行,但是有些无法运行 这是控制台报错 经过多方查找发现原来是windows缺少一些python的扩展包 如下 ...

  10. Servlet读取前端的request payload

    这几天遇见了一个很头疼的事,当我想用表单上传文件时,后端servlet读取不到文件的信息 网上搜索,说是要将form添加这个属性enctype="multipart/form-data&qu ...