asp.net如何控制用户直接输入URL访问资源
比如如果用户在地址栏输入:mysite/123.pdf如果当前用户已经有了合法Session,则他可以浏览或下载但当当前Session为空时,则要显示禁止访问,请问如何控...
比如如果用户在地址栏输入:mysite/123.pdf
如果当前用户已经有了合法Session,则他可以浏览或下载
但当当前Session为空时,则要显示禁止访问,请问如何控制,是在web.config里面设置吗?因为用户输入的不是网页,所以根本不能在aspx网页文件处理,请指教,谢谢。 展开
如果当前用户已经有了合法Session,则他可以浏览或下载
但当当前Session为空时,则要显示禁止访问,请问如何控制,是在web.config里面设置吗?因为用户输入的不是网页,所以根本不能在aspx网页文件处理,请指教,谢谢。 展开
3个回答
展开全部
在<system.web>节中配置
<httpHandlers>
<add verb="*" path="*.pdf" type="Common.Handler.MyFileRestrictHandler" />
<httpHandlers>
IIS 7.0以上请在 <system.webServer>节中配置<handlers>中间内容同上</handlers>
项目中添加下面这个类
namespace Common.Hanlder
{
public class MyFileRestrictHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
public bool IsReusable { get { return true; } }
public void ProcessRequest(HttpContext context)
{
if(context.Request.Session["用户"] == null)
{
context.Response.Write("非法的请求,请登录后下载");
context.Response.End();
}
}
}
}
更多追问追答
追问
按照大虾的方法做了一下,但出现了以下错误:
错误 57 “System.Web.HttpRequest”不包含“Session”的定义,并且找不到可接受类型为“System.Web.HttpRequest”的第一个参数的扩展方法“Session”(是否缺少 using 指令或程序集引用?)
追答
由于凭记忆手打的,打错了, 应该是 context.Session,多打了一个 Request。
另外 命名空间打错了 应该是 Common.Handler
不过,你自己调试一下就不会改了啊。。。
用了这个以后,所有的对.pdf后缀的文件访问 都会先走这个 Handler处理, 这里你可以写你要的处理逻辑。 如果想添加其他后缀名,改 path="*.pdf, *.doc"
展开全部
可以设置response头信息,来实现下载。
至于判断权限,可以在page_load中判断。
//实现下载的函数
private void FileDownload(string fName)
{
System.IO.FileInfo file = new System.IO.FileInfo(fName);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);
Response.End();
Response.Flush();
Response.Clear();
}
//page_load中加入
if(Session["id"]!=null)
{
FileDownload(Server.MapPath("img/1.jpg")); //需要下载的文件
}
至于判断权限,可以在page_load中判断。
//实现下载的函数
private void FileDownload(string fName)
{
System.IO.FileInfo file = new System.IO.FileInfo(fName);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);
Response.End();
Response.Flush();
Response.Clear();
}
//page_load中加入
if(Session["id"]!=null)
{
FileDownload(Server.MapPath("img/1.jpg")); //需要下载的文件
}
追问
由于用户可能直接输入资源地址,page_load 是不会被执行的。
追答
在web.config中加入:
这样的话就可以防止直接打开了。不过这种方法很鸡肋啊。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
pdf的文件名放在数据库中,采用动态页面访问下载地址,在动态页面中设置判断语句
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询