第一种方式:使用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