使用HttpHandler做文件过滤器,验证下载文件权限

公司的下载中心文件从tomcat迁移到了IIS下,原先在tomcat通过过滤器来控制文件的下载,现在也要在IIS里实现过滤器功能.

当然想到的就是用HttpHandler,在网上找了一下,有很多关于图片防盗链的程序,功能相似,但关于文件下载控制的则只有提及,没有程序.
图片和下载中心的需要区别是:
1. 图片只是根据来源地址来看是否盗链,下载中心则要能完url参数来验证权限.
2. 图片文件小,容易WriteFile,下载中心文件有的几G,WriteFile会非常占资源,而且还要考滤续传的问题.

经过修改,最终用了这个版本的:

过滤器
public class DownloadAuthHttpHandler : IHttpHandler, IRequiresSessionState
{
public DownloadAuthHttpHandler()
{
}

#region IHttpHandler 成员

public bool IsReusable
{
get { return false; }
}

public void ProcessRequest(HttpContext context)
{
bool isOk = false;
string username = string.Empty;
string strFileFullName = context.Server.MapPath(context.Request.FilePath);

//是否为断点续传
if (context.Request.Headers["Range"] == null)
{
try
{
string sid = context.Request.QueryString["sid"] == null ? "" : context.Request.QueryString["sid"].ToString();
//验证sid(单点登录认证)
if (!String.IsNullOrEmpty(sid) && LtpaToken.isValid(sid))
{
//解密获得用户名
LtpaToken l1 = new LtpaToken(sid);
username
= l1.getUser();
isOk
= true;
}
else
{
isOk
= false;
}
}
catch (Exception e)
{
throw (new Exception("认证失败", e));
}
}
else
{
isOk
= true;
username
= "<断点续传>";
}

if (isOk)
{
//写日志记录
WriteLog(string.Format("用户{0}开始下载文件{1}", username, strFileFullName));
context.Response.ContentType
= Path.GetExtension(strFileFullName);
context.Response.TransmitFile(context.Request.FilePath);
}
else
{
context.Response.Write(
"验证失败,你不是合法用户");
//写日志记录
WriteLog(string.Format("已拒绝用户下载文件{0}", strFileFullName));
context.Response.End();
return;
}
}
}


context.Response.ContentType = Path.GetExtension(strFileFullName),这样可以不要每种扩展名都去写一个ContentType,非常方便.
值得一提的是,Response.TransmitFile()这个方法找了很多地方才找到的,之前用的是WriteFile(),非常占资源,而且大文件就下不了,后来还是在台湾同胞的网站上找到的(http://www.dotblogs.com.tw/topcat/archive/2008/03/06/1255.aspx).

至于如何在web.config里添加httphandler,如何在IIS里配置文件映射,我这就不细讲了,网上讲的很多.

你可能感兴趣的:(handler)