实现Session 过滤的三种方式

第一种方式:使用HttpModule实现过滤Session功能
新建一个HttpModuleHelper 工具类, 继承 IHttpModule接口 代码如下

 public class HttpModuleHelper : IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.AcquireRequestState += Context_AcquireRequestState;
        }
        //在管道中的 AcquireRequestState的事件中 添加一个方法

        private void Context_AcquireRequestState(object sender, EventArgs e)//Session过滤器
        {
            HttpApplication app = (HttpApplication)sender;//获得 HttpApplication对象
            HttpContext context = app.Context;//获得HttpContext对象
            string url = context.Request.Url.ToString();//获得url
            if (url.Contains("AdminPage"))//如果这个要求访问的url在管理员界面中   则要求验证Session是否登录
            {
                if (context.Session["userInfo"] == null)//如果没登录  直接跳转到登录界面
                {
                    context.Response.Redirect("/2015-02-27/Login.aspx");
                }
            }

        }
    }

然后在web.config中配置 代码如下

<system.webServer>
    <modules>
      <add name="HttpModuleHelper" type="Project.Common.HttpModuleHelper"/>
    </modules>
  </system.webServer>

3:执行的原理.
当创建出HttpApplication时,会执行一系列方法,最后会将Web.config文件中关于HttpModule的配置信息读取一个集合中(这里面包含的HttpModule有程序员自己定义,也有系统的定义)。最后遍历集合,将集合中每个HttpModule取出来,并且执行其中的Init方法。代码如下:

        int count = this._moduleCollection.Count;
    for (int i = 0; i < count; i++)
    {
        this._currentModuleCollectionKey = this._moduleCollection.GetKey(i);
        this._moduleCollection[i].Init(this);//执行HttpModule中的Init方法,其中也包含了我们自己定义的CheckSessionModule中的Init方法。
    }

我们自己定义的CheckSessionModule中的Init方法,主要完成了对请求管道中第九个事件的注册.
public void Init(HttpApplication context)
{
//URL重写。
context.AcquireRequestState+=context_AcquireRequestState;
}
当集合遍历完成以后,开始进入管道了,从管道中的第一个事件开始执行,当走到第9个事件,该事件触发,执行我们自己写的 public void context_AcquireRequestState(object sender, EventArgs e)方法。

第二种方式: 创建一个工具类 这个类继承 System.Web.UI.Page 类
再该类中过滤Session

public class CheckSession:System.Web.UI.Page
    {
        private void Page_Init(Object sender,EventArgs e)
        {
            if (Session["UserInfo"] == null)
            {
                Response.Redirect("/2015-02-27/Login.aspx");
            }
        }
    }

然后将需要过滤的页面不继承Page类而继承这个自定义类

public partial class TestSession : Common.CheckSession  //继承自定义的类
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

第三种方法:使用Global文件中的 Application_AcquireRequestState 方法来过滤 Session

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值