熟悉J2EE Web应用开发的人,都知道在J2EE中有过滤器filter,该filter可以对指定的URL访问进行拦截,并执行过滤器的方法,根据实际应用情况,我们可以在过滤器中修改请求的编码,可以判断会话信息,可以做权限控制,总之这个过滤器是非常有意义的,也可以说是责任链设计模式在J2EE中的一个应用。

那么在ASP.NET中是否也可以定义这样的过滤器结构,并在过滤器中进行相应的逻辑操作呢?答案是肯定,本文将告诉你如果编写一个过滤器,又如何配置到IIS的Web应用之中,因为我很清楚,有些人好不容易知道了怎么写,但是却不知道该如何去配置,网上的帖子基本上是千篇一律的转贴,找半天也往往找不到。

过程一:如何编写过滤器

编写过滤器,其实就是编写一个过滤器的类,也就是编写一个HttpModule模块,这个过滤器应该实现IHttpModule基类,并重写Init方法,给你一个实际的例子如下:

这是一个MyExampleFilter.cs

using System;

using System.Web;

using System.Web.SessionState;

using System.Collections.Generic;

using System.Collections;

using System.Text;

using System.IO;

public class MyExampleFilter: IHttpModule

{

public String ModuleName

{

get { return "MyExampleFilter"; }

}

// In the Init function, register for HttpApplication

// events by adding your handlers.

public void Init(HttpApplication application)

{

application.AcquireRequestState += new EventHandler(Application_AcquireRequestState);

}

private void Application_AcquireRequestState(Object source,

EventArgs e)

{

HttpApplication application = (HttpApplication)source;

HttpContext context = application.Context;

HttpSessionState session = context.Session;

HttpRequest request = context.Request;

HttpResponse response = context.Response;

String contextPath = request.ApplicationPath;

。。。

}

}

需要说明的是,“过滤器”也可以称为是“拦截器”,即拦截整个HTTP请求/响应的过程,因为整个请求/响应过程可以分为许多个阶段,那么这里面就会涉及到一个问题,也就是你的过滤器想拦截具体的哪一个阶段,上面的Init函数中,可以自己定义想拦截的具体阶段,例如上面拦截是产生请求会话的阶段,AcquireRequestStat是这个状态的代表,而拦截后对应的处理函数为Application_AcquireRequestState,所以下面定义了一个Application_AcquireRequestState方法,在该方法中可以通过强制类型转换获得application、context、session、request、response等一系列对象,在获得这些对象的基础上,你就可以进行核心业务逻辑的编写了,例如获得判断当前URL访问是否合法,检查当前访问是否为登录后用户的访问等等。

另外既然有拦截的整个过程有许多阶段,那么如何拦截其它的阶段呢?这个应该很简单了,与上面类似在Init中按如下逻辑定义即可:

application.阶段的标准名称1 += new EventHandler(该阶段对应的处理方法名称1);

application.阶段的标准名称2 += new EventHandler(该阶段对应的处理方法名称2);

。。。

阶段的标准名称,是说这些阶段是有标准的名称的,而且是application对象的标准属性,例如上面AcquireRequestState,还有诸如BeginRequest、AuthenticateRequest、AuthorizeRequest、ResolveRequestCache、AcquireRequestState、PreRequestHandlerExecute、PostRequestHandlerExecute、

ReleaseRequestState、UpdateRequestCache、EndRequest许多阶段等等,这些阶段都有特定的含义,找个标准手册看一下(例如MSDN)或者Google一下也可以,再不清楚可以email给我。

该阶段对应的处理方法名称,其实就是你自己定义对应这个阶段处理的方法,上面已有样例,不再多解释。

还有一点需要特别注意,有那么多阶段可以拦截,但是实际应用中,我们拦截的往往也就一两个阶段,而且要注意有些服务器对象只有在特定的阶段才可以拦截到,例如Session对象在BeginRequest阶段中是没有的,在AcquireRequestState及其以后阶段中是有的,因此要根据实际需求来拦截具体的阶段,这个是新手最容易遇到的问题。

过程二:如何配置过滤

我们编写好了一个.cs文件的过滤器,那么如何让这个过滤器起作用呢,这个需要进行配置,默认肯定是不会拦截的,你需要将该过滤器配置到应用的Web.config文件之中,上述样例的配置如下:

<configuration>

<system.web>

<httpModules>

<add name="MyExampleModule" type="MyExampleFilter"/>

</httpModules>

</system.web>

</configuration>

这样其实就配置好了,然后发布网站生成dll等就可以了,到时后会自动拦截URL访问的,不过要记住一点,默认情况下对于该应用的所有请求都会被拦截,如果你指向拦截特定的请求,例如想只对aspx文件的请求进行拦截,那么可以在过滤器逻辑中加入对文件后缀名的判断,如果不是aspx的直接放过即可。

在ASP.NET中如何添加过滤器相关推荐

  1. ASP.NET中MVC添加Controller以及访问其Action

    场景 ASP.NET中MVC编程模式简介与搭建HelloWorld项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10679 ...

  2. ASP.NET中添加View与Razor引擎以及View解析和Controller向View传值

    场景 ASP.NET中MVC添加Controller以及访问其Action: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106 ...

  3. ASP.NET中的过滤器

    过滤器概述 1.ASP.NET MVC中的每一个请求,都会分配给相应的控制器的对应方法(Action)去处理,而在这些处理的前后如果想再加一些额外的逻辑处理. 2.这可以更好的控制浏览器请求过来的UR ...

  4. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

    本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过Asp.Net创建PDFs,就像HTML和ASP.Net为文本提供了多种容器一样,iTextSharp ...

  5. ASP.NET 2.0 中动态添加 GridView 模板列

      ASP.NET 2.0 中动态添加 GridView 模板列的例子 动态添加列,关键是实现 ITemplate.InstantiateIn 方法.下面是一个添加 GridView 模板列的例子. ...

  6. excel透视表无添加字段_在Excel数据透视表中添加过滤器标记

    excel透视表无添加字段 If you're using Excel 2007 or Excel 2010, you can quickly see which fields in a pivot ...

  7. ASP.NET 2.0 中动态添加 GridView 模板列的...

    framespacing="0" src="http://what.yesky.com/by/ztdh.htm" frameborder="0&quo ...

  8. asp.net中使用#include语法将文件添加到页面

    在asp,jsp,php中我们都可以使用include的方式将某一文件包含在另一文件中.到了asp.net时代由于asp.net2.0提供了母版页的功能,所以不怎么用include方式了.不过母版页也 ...

  9. ASP.Net中自定义Http处理及应用之HttpModule篇

    HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response).HttpHandler功能的实现通过实现IHttpHandle ...

最新文章

  1. java 取字段_java – 获取字段的名称
  2. 【⛔C语言“数组名”,不得不说的秘密!⛔】c语言“数组名字“初探
  3. LBE平行空间的技术实现
  4. Android external storage
  5. 看了就知道为什么别人C语言学习效率那么高了
  6. Python实战从入门到精通第六讲——数据结构与算法4之过滤序列元素
  7. [转]用 ASP.NET 2.0 改进的 ViewState 加快网站速度
  8. nginx启动只有master没有worker_深入探索Nginx工作原理
  9. EC读书笔记系列之18:条款47、48
  10. linux如何跳到命令行开端,Linux快捷键大全
  11. 《App 后台开发运维和架构实践》完整目录
  12. qnx 设备驱动开发_一种QNX系统的USB驱动加载方法与流程
  13. QoS(Quality of Service)服务质量【转自微信公众号开源Linux】
  14. mysql sql 当前日期拼接某个时间段的写法
  15. WZOI基础题库1~15题答案
  16. java程序设计项目_JAVA程序设计项目报告书.doc
  17. 华为防火墙-1(理论)
  18. 硬盘检测 Victoria教程:每个扇区512byte(现在新的硬盘每个扇区有4K)一个块是4K(4096)扇区,1个块由连续的8个扇区组成。Victoria扫描常选块由2048扇区每扇区512字节
  19. java 幻灯片_Java 打印PPT幻灯片
  20. A survey of detection-based video multi-object tracking 论文笔记

热门文章

  1. linux命令最终篇
  2. HQL 如何 count(*) 分页查询出来 group by 的总数?
  3. 亚马逊的新Linux发行版对红帽造成了威胁
  4. Mysql Can't connect to MySQL server
  5. 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.40. Expat-2.1.0...
  6. 《Servlet和JSP学习指南》一2.5 小结
  7. 如果一个国家是一种颜色,中国的颜色美哭了!
  8. 正确的CentOS系统配置
  9. Windows NT Backup - 恢复工具 - Windows Vista的迁移工具
  10. 五八搜索实时索引实现和重构