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

那么在ASP.NET中是否也可以定义这样的过滤器结构,并在过滤器中进行相应的逻辑操作呢?答案是肯定,本文将告诉你如果编写一个过滤器,又如何配置到IIS的Web应用之中。

过程一:如何编写过滤器

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

这是一个PageFilter.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 PageFilter: IHttpModule
{
        public String ModuleName
        {
            get { return "PageFilter"; }
        }

//在 Init 方法中注册HttpApplication 
        // 通过委托方式注册事件
        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许多阶段等等,这些阶段都有特定的含义.

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

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

过程二:如何配置过滤

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

<configuration>
<system.web>
 <httpModules>
   <add name="pageModule" type="PageFilter"/>
 </httpModules>
</system.web>
</configuration>

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

ASP.NET过滤器的应用的更多相关文章

  1. asp.net 过滤器

    asp.net 制作过滤器原理:重写ASP.net管道事件 1.通过HttpApplicationFactory创建一个HttpApplication对象,负责处理整个请求. 2.调用ProcessR ...

  2. ASP.NET过滤器、URL重写

    过滤器可以对指定的URL访问进行拦截,并执行过滤器的方法,根据实际应用情况,在过滤器中修改请求的代码.判断会话信息,也可以做权限控制. 一:编写过滤器,实现URL重写并配置过滤 编写过滤器,就是编写一 ...

  3. 聊一聊Asp.net过滤器Filter那一些事

    最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断.权限认证.日志记录.异常处理等通用操作,在项目中的action中到处都是.在代码优化上,这一点是很重要着力点.这是.net中的过滤器 ...

  4. ASP.NET-ActionFilter过滤器用法实例

    ActionFilter可以对每一个传过来的action请求进行过滤,非常有用,但是如果在这里判断过多,那么网站的性能和速度会不会变慢,这个问题值得思考,现在先放在这里. public class A ...

  5. Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证

    本文通过一个简易安全认证示例的开发实践,理解过滤器和拦截器的工作原理. 很多文章都将过滤器(Filter).拦截器(Interceptor)和监听器(Listener)这三者和Spring关联起来讲解 ...

  6. .NET MVC中登录过滤器拦截的两种方法

    今天给大家介绍两种ASP中过滤器拦截的两种方法. 一种是EF 的HtppModule,另一种则是灵活很多针对MVC的特性类 Attribute 具体什么是特性类可以参考着篇文章:https://www ...

  7. 浅谈Httpmodules

    HttpModule是ASP.NET过滤器,可以理解为HTTP请求的必经之地我们只要实现IHttpModule接口,就可以取代HttpModule namespace BookShop.Handler ...

  8. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...

  9. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

随机推荐

  1. 08.net网站开发(前端):5.jQuery

    开发网站肯定要会JS,嫌代码太难看难学那至少要学会jQuery.当然我见过有些项目纯用服务端控件也是能做出来的,但我相信,那些碰到复杂的需求的话肯定很棘手的.jQuery是对JS和DOM的封装,少量代 ...

  2. 解决shell脚本中 echo 怎么写入换行到文件

    測试环境:ubuntu12.04 LTS版本号 echo >> file.txt就可以, 这样的方法对于脚本开头是bash和sh效果都一样, 而echo -e >> file. ...

  3. 特殊集合(stack、queue、hashtable的示例及练习)

    特殊集合:stack,queue,hashtable stack:先进后出,一个一个的赋值一个一个的取值,按照顺序. .count           取集合内元素的个数 .push()        ...

  4. 关于UITableview刷新笔记

    今天在做项目的时候 发现调用tableview 的 reloaddata 方法的时候出现崩溃. - 具体操作是执行某个方法后将数据数组中的某条数据删除(数组中存数组)发现调用刷新方法后 程序崩溃,查看 ...

  5. Java map取value最大值和最小值

    /** * 求Map<K,V>中Value(值)的最小值 * * @param map * @return */ public static Object getMinValue(Map& ...

  6. Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”

    为什么需要线程 假设需要开发一个联网应用程序,需要从一个网址抓取网页内容,这里读取的网页地址是笔者在本地机器上自己建立的服务器地址.当然在读取网页内容的时候,可以使用HttpClient提供的API, ...

  7. django 基础入门(一)

    1. django 基本命令 新建project django-admin.py startproject project-name 新建app python manage.py startapp a ...

  8. NAS简介

    转自IBM资料库:https://community.emc.com/docs/DOC-15977 在20世纪80年代初,英国纽卡斯尔大学布赖恩.兰德尔教授 ( Brian Randell)和同事通过 ...

  9. 用JS判断用户使用的是手机端还是pc端访问

    最近项目中用到一个应用,当访问同一个网站地址的时候,例如:www.xxx.com的时候,如果当前客户端是pc则跳转到专注于pc的部分,如果当前客户机是手机,则跳转到专注于手机的部分,秉承一贯的习惯,b ...

  10. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...