HttpHandler是定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定,是对请示的响应,可以输出普通的html内容,也可以输入图片或文件(下载也可)。

在前面的一般处理程序中,都用到了IHttpHandler.

特别是我们会发现有时朋友给你发个网址,你打开后会发现是一张贺卡,上面有你的名字和好看的图像。这是如何实现的呢?

其实就是把图片写在处理程序中,图片中有个空缺的地址,用一般处理程序把你的名字写到这个空缺的地方,名字就是浏览器发过来的请求参数,然后用用片的bitmap.Save(context.Response.OutputStream, ImageFormat.Jpeg)发回到客户端即可。

  • 如果HttpHandler输出的是html,txt,jpeg等类型的信息,则浏览器会直接显示,如果希望弹出保存对话框,则需要添加Header:string encodeFilename=HttpUtility.UrlEncode("过滤词.txt"),Response.AddHeader{"Content-Disposition","attachment; filename="+encodeFilename};其中filename后为编码后的文件名,主要是防止中文名称乱码。是客户在下载时看到的保存时的默认名称。

以下为文件下载的源码(一个文本和一张图片,在客户端点击连接是并不是直接显示在浏览器中,而是弹出一对话框询问用户是否保存):

服务端(一般处理程序):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace download
{/// <summary>/// downdialog 的摘要说明/// </summary>public class downdialog : IHttpHandler{public void ProcessRequest(HttpContext context){string flag = context.Request["flag"];string ct = "";string fname = "";string defaultname="";if (flag == "0") //文本文件
            {ct = "text/plain";fname = "/file/jquerycook.txt";defaultname=HttpUtility.UrlEncode("我的文本.txt"); //为url编码
            }else{ct = "image/JPEG";fname = "/file/2479.jpg";defaultname=HttpUtility.UrlEncode("我的图片.jpg");}context.Response.ContentType = ct;context.Response.AddHeader("Content-Disposition","attachment;filename= "+defaultname);context.Response.WriteFile(fname);}public bool IsReusable{get{return false;}}}
}

客户端:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><a href="downdialog.ashx?flag=1">下载图片</a><a href="downdialog.ashx?flag=0">下载文本</a></div></form>
</body>
</html>

另个例子是,只有登录的vip和普通用户才能下载三幅图片,普通用户下载时,图片上显示“免费用户试样”的字样。

如果是直接登录到下载图片的页面,则会到计时提示即将到登录界面。

1.先建立数据表,字段为id,用户名,密码及它的级别,级别主要区分是vip还是普通用户。

2.“添加”-〉“新建项”->"数据"->"数据集",我们对用户 表建立一个*.xsd的数据集,放在DAL(数据操作)文件夹中,主要是方便用数据表进行操作。

3.在imgs文件夹中放三个图片。

4.建立服务处理程序,(一般处理程序,主要是处理图片)

5.建立登录界面,如果用户 不存在或密码不正确就提示不能登录。

6.建立download界面,当用户点击要下载的图片时,会把这个连接传给服务处理程序来处理

7.如果用户没有登录则会弹出Redirect1.login.htm页面,会倒计时并重新定位到登录页面。用户是否登录可用session即可,以下为目录图像和源码:

  • 程序目录

数据集结构:

  • 登录界面

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><asp:Label ID="Label1" runat="server" Text="用户名:"></asp:Label><asp:TextBox ID="txtUser" runat="server"></asp:TextBox><br /><asp:Label ID="Label2" runat="server" Text="密码:"></asp:Label>
&nbsp;<asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox><br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<asp:Button ID="btnlog" runat="server" οnclick="btnlog_Click" Text="Login" /><asp:Label ID="msgError" runat="server" BackColor="#FF5050" Visible="False"></asp:Label><% =address %></div></form>
</body>
</html>

button的源码:

 protected void btnlog_Click(object sender, EventArgs e){T_UsersTableAdapter userTA = new T_UsersTableAdapter();var user = userTA.GetDataByName(txtUser.Text);if (user.Count <= 0){msgError.Text = "此用户不存在.";msgError.Visible = true;return;}var data = user.Single();if (data.UserPWD == txtPassword.Text){Session["ID"] = data.ID;Session["Level"] = data.Level;msgError.Visible = false;Response.Redirect("download.htm");                }else{msgError.Text = "登录不正确,请重新登录";msgError.Visible = true;txtPassword.Focus();}}

  • 下载页面的源码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title>
</head>
<body><a href="download.ashx?filename=1.jpg">下载图片1</a><a href="download.ashx?filename=2.jpg">下载图片2</a><a href="download.ashx?filename=3.jpg">下载图片3</a>
</body>
</html>

  • 倒计时页面源码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>提示</title><script type="text/javascript">var lefttime = 5;setInterval(function () {if (lefttime <= 0) {window.location.href = "login.aspx";}document.getElementById("div").innerText = lefttime;lefttime--;}, 1000);</script>
</head>
<body>将在<div id="div"></div>秒后到登录页面,也可以点<a href="login.aspx">这里</a>直接到登录界面.
</body>
</html>

  • 服务端处理程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Imaging;namespace downloadPermisstion
{/// <summary>/// download 的摘要说明/// </summary>public class download : IHttpHandler,IRequiresSessionState{public void ProcessRequest(HttpContext context){var ID=context.Session["ID"];if (ID == null) //未登录,强制到登录界面
            {context.Response.Redirect("~/RedirectLogin.htm");}else{context.Response.ContentType = "image/JPEG";string fname=context.Request["filename"];string imgname=context.Server.MapPath("~/imgs/"+fname);string defaultdownname="";if (fname.First()=='1'){defaultdownname=HttpUtility.UrlEncode("图片1.jpg");}else if (fname.First()=='2'){defaultdownname=HttpUtility.UrlEncode("图片2.jpg");}else if (fname.First()=='3'){defaultdownname=HttpUtility.UrlEncode("图片3.jpg");}context.Response.AddHeader("Content-Disposition", "Attachment; filename=" + defaultdownname);using (Bitmap bmp = new Bitmap(imgname)){using (Graphics g = Graphics.FromImage(bmp)){int level = Convert.ToInt32(context.Session["Level"]);if (level == 0) //普通用户
                        {g.DrawString("免费用户试样", new Font("宋体", 30), Brushes.AliceBlue, new PointF(0, 0));   }bmp.Save(context.Response.OutputStream,ImageFormat.Jpeg);}}}}public bool IsReusable{get{return false;}}}
}

当然上面的程序我们可以用登录失败的次数来防止暴力登录的功能,如登录5次就只能过30分钟才能再登录等

……

转载于:https://www.cnblogs.com/yagzh2000/archive/2013/06/09/3128323.html

5 HttpHandler相关推荐

  1. ASP.NET的(HttpModule,HttpHandler)

    在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请求转交给asp.dll进程 ...

  2. ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)

    学习整理了一下 (一).功能 用HttpHandler实现图片验证码 (二).代码如下 1. 处理程序文件 ValidateImageHandler.ashx代码如下  1 <%@ WebHan ...

  3. HttpModule与HttpHandler详解

    ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll, ...

  4. ashx文件和HttpHandler

    ashx 文件用于写web handler的..ashx必须包含IsReusable. 如下例所示.}.ashx比.aspx的好处在与不用多一个html 注意了VS2005中Web应用程序项目模板里的 ...

  5. HttpHandler与HttpModule区别

    ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...

  6. ASP.Net中自定义Http处理及应用之HttpHandler篇

    摘自:http://hi.baidu.com/irinihp/blog/item/c96a011ea1f78ff31ad576f8.html 很多时候,我们新建一个xxx.aspx页和xxx.aspx ...

  7. 选择HttpHandler还是HttpModule?

    阅读目录 开始 理解ASP.NET管线 理解HttpApplication 理解HttpHandler 理解HttpModule 三大对象的总结 案例演示 如何选择? 最近收到几个疑问:HttpHan ...

  8. HttpModule与HttpHandler详解(转)

    一 asp.net请求的处理过程 ------------------- HttpModule必须要掌握的东西 HttpHandler 必须要掌握的东西,非常有用 以上两个的实例 ---------- ...

  9. 理解并自定义HttpHandler

    前言 之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过.经过上一篇<asp.net管道模型(管线模型)之一发不可收拾>的总结,对管道模型和请求/响应过 ...

最新文章

  1. 代码注释照样可以玩出花来
  2. SIGIR 2020开幕在即,智源学者论文收录占10%
  3. 【 Vivado 】输入延迟约束(Constraining Input Delay)
  4. python视频网站分类_用Python爬取b站视频
  5. Oracle教程之分析Oracle索引扫描四大类
  6. 如何编辑PDF文件,教你几招轻松搞定
  7. vscode不能跳转_vscode-goto-node-modules 一个快速定位 node 模块的 vscode 插件
  8. 微信小程序图片自适应大小(炒鸡详细)
  9. java 面试高频问题 java8新特性
  10. 移动充电宝市场需求的调研报告
  11. deepin输入法配置
  12. Jenkins:This is especially strange since your build otherwise succeeded.及不是内外部指令问题
  13. 性能测试监控TP50、TP99、TP999含义
  14. 在我的网站   Φ十三月网Φ  开站前的宣传,当我是炒作,造势都可以,但是我们要的是有内涵。
  15. 12.14黄金白银欧美盘走势分析及期货原油操作建议
  16. 加州大学圣地亚哥计算机硕士申请,多次催促 成功申请加州大学圣地亚哥分校计算机科学...
  17. 1714. 混合牛奶
  18. C++类和对象介绍(筑基上篇)
  19. 第一个hollo world程序
  20. flutter与node.js的前后端项目

热门文章

  1. 有了“手掌”,机械手也能盘“核桃”,耶鲁出品 | Science子刊
  2. 一段语音生成说话视频,连发际线都可以分好几种,网友:利好视频博主
  3. 机器学习也能套模版:在线选择模型和参数,一键生成demo
  4. 2D变3D,视角随意换,神还原高清立体感,还是不用3D建模的那种 | 代码数据开源...
  5. 计算机技能最新需求排名:Python增速爆炸,SQL和Java老当益壮,AWS令人惊讶
  6. MIT用超导体制成极低功耗神经元,能效接近人类大脑,比计算机高4个量级
  7. Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#Object‘的解决方法...
  8. Android仿QQ列表滑动弹出按钮、长按提示、刷新列表
  9. centos增加软连接
  10. CentOS安装tomcat