今天给大家介绍两种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. [日志分析]Graylog2采集mysql慢日志

    之前聊了一下graylog如何采集nginx日志,为此我介绍了两种采集方法(主动和被动),让大家对graylog日志采集有了一个大致的了解. 从日志收集这个角度,graylog提供了多样性和灵活性,大 ...

  2. 通过locust进行性能测试

    首先我们需要准备好python环境 接口 安装python 插件 locust,网上有很多文章而且都很错,这里不再赘述 我是通过pycharm 编写的代码  导入 HttpLocust,TaskSet ...

  3. C# Bitmap 转 Bytes数组

    首先是Bitmap 转 MemoryStream MemoryStream ms = new MemoryStream(); bitmap.save(ms, ImageFormat.Jpeg); ms ...

  4. 【Weiss】【第03章】队列例程

    前几个例程还是相当简单的,把链表即时改了一下就是队列了. 还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面. 测试代码如下: #include &l ...

  5. Natas26 Writeup(PHP反序列化漏洞)

    Natas26: 打开页面是一个输入坐标点进行绘图的页面. <html> <head> <!-- This stuff in the header has nothing ...

  6. Natas11 Writeup(常见编码、异或逆推、修改cookie)

    Natas11: 页面提示cookie被异或加密保护,查看源码,发现了一个预定义参数和三个函数. //预定义参数,猜测将showpassword设置为yes即可得到密码. $defaultdata = ...

  7. python员工管理系统(基础版)

    各位小伙伴们大家好,最近自学python已经差不多把基础学完了,现在运用这些基础知识写了一个简单版本的员工管理系统 因为在大学里我是学过java的,所以,当有了一定的基础和熏陶外,真心觉得python ...

  8. webpack打包es6代码

    1.简单描述一下es6的模块导入和导出的语法: //导出:export var aa = 10;export function demo(){} //不能写成:var aa = 10;export a ...

  9. JDBC(三)----Spring JDBC(JDBCTemplate)

    ##  Spring  JDBC *  Spring框架对JDBC的简单封装.提供了一个JDBCTemplate对象简化JDBC的开发 1.步骤 1.导入jar包 2.创建JDBCTemplate对象 ...

  10. wr720n v4 折腾笔记(二):刷入不死Uboot

    0x01 前言 接着上节刷入Openwrt开始说起,此次开始刷入不死Uboot,刷入之后就可以在Uboot里面随便刷机,再也不怕成砖了. 固件附件地址: 下载地址1(还是之前一的包) flash文件地 ...