zoukankan      html  css  js  c++  java
  • 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类的完全限定名

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/HopeGi/p/2867911.html
Copyright © 2011-2022 走看看