.net过滤器重写beginrequest

在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的直接放过即可

时间: 2024-10-07 14:07:06

.net过滤器重写beginrequest的相关文章

Asp.Net MVC part45 过滤器、模板页

过滤器 使用方式自定义类继承自相应的类或接口,重写方法,作为特性使用在控制器类中重写方法 特性方式的使用注意:如果继承自接口需要让类实现FilterAttribute,才可以作为特性使用使用方式1:作为Controller或Action的特性使用方式2:在Global中注册为全局过滤器,应用于所有的Controller的Action参数类均继承自ControllerContext,主要包含属性请求上下文.路由数据.结果 身份验证过滤器在约束的Action执行前执行重写OnAuthorizatio

MVC中的过滤器

authour: chenboyi updatetime: 2015-05-09 09:30:30 friendly link:   目录: 1,思维导图   2,过滤器种类(图示) 3,全局过滤器   4,ActionFilterAttribute  5,AuthorizeAttribute   6,HandleErrorAttribute 1,思维导图: 2,过滤器种类(图示): 3,全局过滤器: 程序员可以自己定义过滤器,并将其设为全局或者单个类.单个方法上得过滤器,如果要把自定义过滤器设

利用过滤器和反射技术对string类型的入参进行统一trim

背景 最近做的一些项目都是后台管理系统,主要是对表单数据的增删改查操作,其中有些表单项是字符串类型的,对于这些类型的表单项就需要在保存或编辑之前要进行.trim()处理,刚开始感觉没什么,遇到了就手动进行.trim()一下,感觉很正常,因为Java本身就提供了这么一个字符串处理的方法,感觉每次都这么做也不能嫌麻烦,理所应当.但是是随着业务的发展,需要这么处理的地方越来越多,虽然每次都小心谨慎,但难免会有遗漏,导致不该出现问题的地方出现了问题,对于这些不该出现的低级错误感到痛心.于是想,能不能写一

ASP.NET MVC5(一):ASP.NET MVC概览

ASP.NET MVC概览 ASP.NET MVC是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. ASP.NET MVC模式简介 MVC将Web应用程序划分为三个主要的部分,以下是MSDN给出的定义: 模型(Model):模型对象是实现应用程序数据域逻辑的应用程序部件. 通常,模型对象会检索模型状态并将其存储在数据库中. 例如,Product 对象可能会从数据库中检索信息,操作该信息,然后将更新的信息写回到 SQL S

ASP.NET MVC5 入门

参考资料<ASP.NET MVC5 高级编程>第5版 第1章 入门 1.1 ASP.NET MVC 简介 ASP.NET MVC是一种构建Web 应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET 框架. 在分离应用程序的关注点方面(例如,从显示逻辑中分离出数据访问逻辑),MVC是一种强大而简洁的方式. MVC 将应用程序的用户界面(User InterFace,UI)分为三个主要部分: 模型:一组类,描述了要处理的数据以及修改和操作数据的业

Servlet程序获取http协议提交的信息

Servlet程序获取http协议提交的信息 Servlet程序获取http协议提交的信息 实现过程以及存在的问题 编码问题 实现过程以及存在的问题 下面是其Java Servlet代码: package com.jpzhutech.servlet; import java.io.IOException; import java.io.InputStream; import java.nio.Buffer; import java.util.Enumeration; import javax.s

spring集成shiro登陆流程(上)

上一篇已经分析了shiro的入口filter是SpringShiroFilter, 那么它的doFilter在哪儿呢? 我们看到它的直接父类AbstractShrioFilter继承了OncePerRequestFilter类,该类是shiro内置的大部分filter的父类(抽像公共部分),在该类中定义了doFilter方法 OncePerRequestFilte public final void doFilter(ServletRequest request, ServletResponse

重写struts过滤器

<filter> <filter-name>ExtendStrutsFilter</filter-name> <filter-class> com.lt.xiaoliao.util.ExtendStrutsFilter </filter-class> </filter> <filter-mapping> <filter-name>ExtendStrutsFilter</filter-name> &l

利用Global 的BeginRequest事件实现域名的重写

直接可以通过Global.asax文件中的Application_BeginRequest事件就可以实现域名的重写,如果Global.asax中没有Application_BeginRequest方法,可直接添加. void Application_BeginRequest(object sender, EventArgs e){string path = Request.Url.ToString();//获取地址栏地址if (Regex.IsMatch(path, "http://www.xi