HttpHandler应用之 - 创建图片校验码

HttpHandler 可以直接写入一个 .ashx 而不需要被编译。顺便说下ashx 文件是用于写web handler的。一般用来处理生成动态图片、生成动态文本等不需要回传处理的任务。OK,不多废话,步入正题。下面在 .ashx 中构造一个图像生成器来创建校验码,它用来防止 Web 应用程序中的自动注册。先看代码:

 

Image.ashx

<%@ WebHandler Language="C#" CodeBehind="Image.ashx.cs" Class="HttpHandlerDemo.Image" %>

 

Image.ashx.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

using System.Drawing;

using System.Text;

using System.Drawing.Imaging;

 

namespace HttpHandlerDemo

{

    /// <summary>

    /// 图像生成器,用于创建图片校验码

    /// </summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    public class Image : IHttpHandler

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "image/gif";

            Bitmap b = new Bitmap(200, 60);

            Graphics g = Graphics.FromImage(b);

            g.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60);

            Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);

            Random r = new Random();

            string letters = "ABCDEFGHRJKLMNOPQRSTUVWXYZ";

            string letter;

            StringBuilder s = new StringBuilder();

            //随机生成字母,基于字母使用 Graphics 类生成位图

            for (int i = 0; i < 5; i++)

            {

                letter = letters.Substring(r.Next(0, letters.Length - 1), 1);

                s.Append(letter);

                g.DrawString(letter, font, new SolidBrush(Color.Black), i * 38, r.Next(0, 16));

            }

 

            //在已生成的随机字母位图上画随机线条

            Pen linePen = new Pen(new SolidBrush(Color.Black), 2);

            for (int i = 0; i < 6; i++)

            {

                g.DrawLine(linePen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));

            }

            b.Save(context.Response.OutputStream, ImageFormat.Gif);

            //context.Session["pfregisterimage"] = s.ToString();

            context.Response.End();

        }

 

        public bool IsReusable

        {

            get

            {

                return true;

            }

        }

    }

}

 

       生成效果图

主要操作都是在 ProcessRequest() 方法中完成的。首先随机生成一个五个字母的字符串,基于这些字母使用 Drawing 命名空间下的各个类生成位图,将字母随机摆放。然后在位图上画一些随机线条,使计算机难以识别。

     最终将图片以 GIF 文件的形式保存并发总给 Response 对象的 OutputStream 。 可以将随机生成的字母保存到 Session 中,当用户输入完验证码,窗体会送时,将 Session 中的值和用户的输入比较,确认用户是人工输入。

转载于:https://www.cnblogs.com/heyCoding/archive/2009/12/03/1616541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值