当前位置:首页 > IHttpHandlerFactory的运用(权限控制)

IHttpHandlerFactory的运用(权限控制)

点击次数:1133  更新日期:2010-12-30
\n

IHttpHandlerFactory在asp.net中算是用处比较多的啦。它能够在Handel对象生成前对当前页面的Handel进行预处理。
下面我就用IHttpHandlerFactory来实现我的权限控制(基于角色)
先贴 代码:
Code
1using System;
2using System.Web;
3using System.Web.UI;
4using System.Collections.Generic;
5
6namespace Ants.HttpBase
7{
8 public abstract class MyHttpHandle:IHttpHandlerFactory
9 {
10 private string[] roles;
11
12 protected string[] Roles
13 {
14 get { return roles; }
15 set { roles = value; }
16 }
17 public MyHttpHandle()
18 {
19 Creat();
20 }
21 IHttpHandlerFactory 成员#region IHttpHandlerFactory 成员
22
23 public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
24 {
25 if (Roles.Length == 0)//如果角色属性没有的话,抛出异常
26 { throw new Exception(“初始化属性时失败!请联系 Ants”); }
27 PageHandlerFactory factory = (PageHandlerFactory)Activator.CreateInstance(typeof(PageHandlerFactory), true);
28 IHttpHandler handler = factory.GetHandler(context, requestType, url, pathTranslated);//获取当前的Hander
29 Execute(handler);//执行验证方法
30 return handler;//返回处理过后的Hander
31 }
32
33 private void Execute(IHttpHandler handler)
34 {
35 if (handler is Page)
36 {
37 List<bool> result = new List<bool>();
38 foreach (string tmp in Roles)
39 {
40 result.Add(((Page)handler).User.IsInRole(tmp));
41 }
42 if(!result.Contains(true))//如果角色没有被允许
43 {
44 ((Page)handler).PreLoad += new EventHandler(MyHttpHandle_PreLoad);
45 }
46 }
47 ((Page)handler).LoadComplete += new EventHandler(MyHttpHandle_LoadComplete);
48
49 }
50
51 void MyHttpHandle_LoadComplete(object sender, EventArgs e)
52 {
53 ((Page)sender).Title += ” – Ants ” ;
54 }
55 void MyHttpHandle_PreLoad(object sender, EventArgs e)
56 {
57 Extent(); //没有被允许访问的角色执行此虚方法
58 }
59 public void ReleaseHandler(IHttpHandler handler)
60 {
61
62 }
63 protected abstract void Creat();
64 protected virtual void Extent()
65 {
66 System.Web.HttpContext.Current .Response.Redirect(“~/error.aspx”);
67 }
68 #endregion
69 }
70}
我们新建了一个名为MyHttpHandle 的抽象类,此类用来实现我们的IHttpHandlerFactory接口。
属性:Roles是我们要传进来的角色组
在MyHttpHandle的初始函数中,我们定义了一个Creat()的抽象方法。子类需通过此方法给Roles属性赋值
Execute 方法为功能实现的主体。


\n

我们再定义一个类(MyTest),继承这个抽象类,
然后在配制文件<httpHandlers>节点下加入或修改下面的地方
<add verb=”*” path=”member/*/*.aspx” type=”MyTest”/>path为我们要验证的文件路径。


\n

来源:http://www.cnblogs.com/leleroyn

\n