使用IHttpHandler做权限控制
来源:互联网 发布:淘宝客服的沟通技巧 编辑:程序博客网 时间:2024/04/28 15:02
前言
在对项目制定权限控制方案的时候往往有几种方案,比如让所有的ASPX页继承一个自定义的PageBase页,而这个页再继承System.Web.UI.Page;另外一种就是使用IHttpModule了。我们先来比较两种方案以及适用性,第一种方案是比较理想也实际运用中比较多的,但是经常会碰到我们突然加入一个项目(可能比较糟糕的),他们一开始就没有这方面的考虑,后来才考虑增加的,此时你发现页面已经到了2百个甚至更多,让每个页面重新继承至PageBase工作量比较大,改动比较多就不太方便了(仍然是比较推荐的);可能此时已经想到偷懒的办法用IHttpModule,但是我不得不说性能实在堪忧,任何页面包括用户控件都会过来请求一次,打断点调试你就会发现,如果页面上有3个用户控件,那多IHttpModule访问应该在4次或4次以上,再加上Ajax访问,其他不要控制的页面也被强制控制了,虽然默认也会访问但是实在是不太理想!!早之前我就一直想用IHttpHandler来做权限控制的,但是发现没有Java里面的过滤器好用,他不会继续你的请求,需要你自己来指定下一步再怎么做,到底是跳转到其他页呢还是直接返回文件流呢由你来决定,一般用来做防盗链、页面重定向比较好。我比较喜欢IHttpHandler就是他能起到控制指定文件夹内访问截获,这样我们就可以对指定的文件夹进行访问控制了,接下来我给大家分析下到底如何实现以及遇到的问题,及其解决办法。
感谢
[分享]在自定义的HttpHandler中调用.net默认HttpHandler的方法
没有这篇文章的解决办法就没有我这篇文章了,再次感谢!!
正文
Web.Config配置如下:
整个IHttpHandler实现代码如下:
/// 本HttpHanderPowerControls可以控制权限,但是在使用AjaxPro的时候AjaxPro.Utility.RegisterTypeForAjax需要指定第二个参数,否则会报错
/// 如:AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default),Page);
/// </summary>
public class HttpHanderPowerControls : IHttpHandler, IRequiresSessionState
{
/// <summary>
/// 获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
/// </summary>
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
HttpSessionState session = context.Session;
//权限判断
if (session["uname"] != null && !string.IsNullOrEmpty(session["uname"].ToString()))
{
//Type type = BuildManager.GetCompiledType(path);
//ASP.NET 1.1使用以下语句获得IHttpHandler
//context.Server.Transfer(PageParser.GetCompiledPageInstance(path, context.Request.PhysicalPath, context),true);
//AjaxPro.Utility.RegisterTypeForAjax(type, handler as Page);
context.Server.Transfer(BuildManager.CreateInstanceFromVirtualPath(context.Request.Path, typeof(Page)) as IHttpHandler, true);
}
else
{
context.Server.Transfer("/login.aspx");
}
}
}
代码说明:
1. 这里我只截获.aspx的文件请求访问,所以CreateInstanceFromVirtualPath第二个参数指定成typeof(Page)就行了,当然也可以用BuildManager.GetCompiledType(path)获得它的Type,调试的时候我发现这行代码比较费时间,而且也不需要就直接用了Page了
2. BuildManager.CreateInstanceFromVirtualPath 方法 MSDN说法:处理给定了虚拟路径的文件,并创建结果的实例。 [分享]在自定义的HttpHandler中调用.net默认HttpHandler的方法 提供的是我注释掉的部分,是ASP.NET 1.1使用,当然2.0下也能使用!
流程说明:
用户访问根目录下/page目录下的aspx页面,将被HttpHanderPowerControls截获,在ProcessRequest里进行权限判断,如果有权限的话继续执行页面(手动创建编译指定的页面的实例);如果没有权限,跳转到login页面。
注意问题:
1. 在使用AjaxPro的时候AjaxPro.Utility.RegisterTypeForAjax需要指定第二个参数,例如:AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default),Page);
指定为Page就行了,否则会报错显示类型转换失败!
2. path的匹配问题,他不能匹配子目录内的文件,支持简单的*、?通配符,例如:/page/* -> 就只能匹配page目录下的文件 /page/*/* -> 能匹配page目录下任意一级子目录下的文件。
3. 在使用验证码的时候注意了,如果也是用Page页返回并且在权限控制范围内的话注意要过滤掉!
遗留问题:
1. 这样做到底会不会造成性能上的损害?!
2. 对于属性IsResult仍然持不理解状态!
结束
欢迎大家交换意见,继续探索权限控制方面在ASP.NET中的解决方案:)
From:http://www.cnblogs.com/over140/archive/2008/11/13/1332384.html
- 使用IHttpHandler做权限控制
- 使用acegi做权限控制
- 实现IHttpHandler接口来控制文件下载权限
- 只使用servlet做系统功能权限的控制
- springboot使用Spring Security+OAuth2做权限控制
- 用session做权限控制
- IHttpHandler使用范例
- IHttpHandler使用范例
- 学习IHttpHandler的使用 。
- 使用二进制 权限控制
- 使用二进制权限控制
- 用SQL语句做权限控制
- struts interceptor拦截器做权限控制
- struts2采用拦截器做权限控制
- java shiro做登陆权限控制
- 决定不使用AcegiSecruity的ACL做实例级权限控制
- 使用Yii框架做权限验证 -- 从无到企业级别控制
- springmvc整合shiro做登陆权限控制,使用mongodb存储session
- MSSQL优化之————探索MSSQL执行计划
- Java关键字new和newInstance的区别
- 如何让select的样式也漂亮起来
- 二十几种CSS分页效果
- 《WebGIS开发实践手册》1.1.3 WWW的工作协议
- 使用IHttpHandler做权限控制
- C#调用C++Dll例程
- 今日,看到一句话。挺好的!
- 测试上传图片2
- 第一个VML网页实例(画图)
- 视频封装格式介绍
- td自动换行
- 用于运行 ASP.NET 的进程帐户必须具有对 IIS 元数据库
- Bourne Shell