ASP.NET的URL过滤

最近做的一个Web项目需要对URL进行过滤,在网上搜了一下,知道J2EE有个Filter的东西,而在.NET方面,其实也可以实现。

下面是类的定义。

 1 using System;
 2 using System.Web;
 3 using System.Web.SessionState;
 4 
 5 namespace QTJZ
 6 {
 7     public class Filters : IHttpModule, IRequiresSessionState
 8     {
 9         public void Dispose() { }
10 
11         public void Init(HttpApplication application)
12         {
13             application.AcquireRequestState += new EventHandler(application_AcquireRequestState);
14         }
15 
16         public void application_AcquireRequestState(object sender, EventArgs e)
17         {
18             HttpApplication application = sender as HttpApplication;
19             HttpRequest request = application.Request;
20             HttpResponse response = application.Response;
21 
22             string url=request.CurrentExecutionFilePath.Trim('/');
23             string suffix = request.CurrentExecutionFilePathExtension.Trim('.');
24 
25             if (!url.Equals("Default.htm") && (suffix == "aspx" || suffix == "htm"))
26             {
27                 object sessionObj = application.Context.Session == null ? null : application.Session["useID"];
28                 if (sessionObj==null)
29                 {
30                     response.Redirect("~/Default.htm");
31                 }
32             }
33         }
34     }
35 }

为了实现过滤的效果,Filters类需要实现IHttpMoeld接口,实现该接口需要有两个方法,一个是Dispose,另一个是Init。Init的参数是一个HttpApplication类型的实例,利用这个实例注册一些事件。由于现在要对URL进行过滤,因此注册的是AcquireRequestState事件。类似事件罗列如下

BeginRequest在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
AuthenticateRequest当安全模块已建立用户标识时发生。
AuthorizeRequest当安全模块已验证用户授权时发生。
ResolveRequestCache

在 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务后发生,

从而绕过事件处理程序(例如某个页或 XML Web services)的执行。

AcquireRequestState当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
PreRequestHandlerExecute恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
PostRequestHandlerExecute在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生。
ReleaseRequestState在 ASP.NET 执行完所有请求事件处理程序后发生。 该事件将使状态模块保存当前状态数据。
UpdateRequestCache当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。
EndRequest在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生。

获取要跳转的url可以用request的CurrentExecutionFilePath属性,而获取请求文件的后缀可以用CurrentExecutionFilePathExtension,至于要按什么规则来判断,按需求而定。我这里是在请求时判断Session是否存在,不存在则跳转回登陆页面。由于要用到Session,打开页面的时候会抛出异常,异常信息是“会话状态在此上下文中不可用。”,在实现了IRequiresSessionState接口之后就没有异常抛出了。

此外,还需要在配置文件Web.config的 <system.web>节点下添加如下代码

       <httpModules>
        <add name="filters" type="QTJZ.Filters"/>
      </httpModules>

其中type属性则是上面Filters类的完全限定名

转载于:https://www.cnblogs.com/HopeGi/archive/2013/01/20/2867911.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值