您的位置:首页 > 其它

【新闻发布系统】——验证码的那些事 Ⅰ

2014-11-05 22:05 113 查看



经常上网的,应该都看到过验证码这个东西。平时我们登陆网站、注册账号什么的,都需要我们输入验证码。


上午,跟着牛腩老师学习了后台登陆的章节。其中,新闻发布系统的后台登陆界面也用到了验证码这个技术。原来一直认为验证码这个东西特别高大上,不过,今天看了视频之后,感觉牛腩老师的讲解下,好像特别的简单。

当然,不能光看,还要自己动手去做。好吧,说做就做,打开VS2012,就开始按着视频中讲解的步骤,开始写起代码来。

具体操作步骤:

一、首先,在Web层添加一个Handler文件夹,在里边新建一个 一般处理程序WaterMark.ashx。

<%@ WebHandler Language="C#" Class="WaterMark" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Web.SessionState;

public class WaterMark : IHttpHandler, IRequiresSessionState  // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间
{

    public void ProcessRequest(HttpContext context)
    {
        string checkCode = GenCode(5);  // 产生5位随机字符
        context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
        Graphics g = Graphics.FromImage(image);
        try
        {
            //生成随机生成器
            Random random = new Random();

            //清空图片背景色
            g.Clear(Color.White);

            // 画图片的背景噪音线
            int i;
            for (i = 0; i < 25; i++)
            {
                int x1 = random.Next(image.Width);
                int x2 = random.Next(image.Width);
                int y1 = random.Next(image.Height);
                int y2 = random.Next(image.Height);
                g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
            }

            Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
            System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);
            g.DrawString(checkCode, font, brush, 2, 2);

            //画图片的前景噪音点
            g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            context.Response.ClearContent();
            context.Response.ContentType = "image/Gif";
            context.Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            g.Dispose();
            image.Dispose();
        }
    }

    /// <summary>
    /// 产生随机字符串
    /// </summary>
    /// <param name="num">随机出几个字符</param>
    /// <returns>随机出的字符串</returns>
    private string GenCode(int num)
    {
        string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char[] chastr = str.ToCharArray();
        // string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" };
        string code = "";
        Random rd = new Random();
        int i;
        for (i = 0; i < num; i++)
        {
            //code += source[rd.Next(0, source.Length)];
            code += str.Substring(rd.Next(0, str.Length), 1);
        }
        return code;
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}


二、HTML界面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="Web.admin.login" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>后台登陆—牛腩新闻发布系统</title>
    <link href="../css/login.css" rel="stylesheet" />
    <script language="javascript" type="text/javascript">
        function changeCode() {
            var imgNode = document.getElementById("vimg");
            imgNode.src = "../handler/WaterMark.ashx?t=" + (new Date()).valueOf();  // 这里加个时间的参数是为了防止浏览器缓存的问题  
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div id="loginfrm" class="round1">
            <h3>后台登陆—牛腩新闻发布系统</h3>
            <div id="login">
                <img src="../images/niunanlogo.jpg" alt="LOGO" class ="login_logo" />
                <p>用户名:<asp:TextBox ID="txtName" runat="server" CssClass="textbox"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="请输入用户名!" Text ="*" ControlToValidate ="txtName"></asp:RequiredFieldValidator>
                </p>
                <p>密 码:<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" CssClass="textbox"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="请输入密码!" Text ="*" ControlToValidate ="txtPassword"></asp:RequiredFieldValidator>
                </p>
                <p>
                    验证码:<img src="../handler/WaterMark.ashx" id="vimg" alt="" onclick="changeCode()" />
                    <asp:TextBox ID="txtCode" runat="server" CssClass="textcode"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="请输入验证码!" Text ="*" ControlToValidate ="txtCode"></asp:RequiredFieldValidator>
                </p>
                <p>
                    <asp:Button ID="btnLogin" runat="server" Text="登陆" />
                    <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox ="true" ShowSummary ="false"  />
                </p>
            </div>
            <div id="footer">版权所有   ©   <a href="http://blog.csdn.net/u010164936" target="_blank">杨晨光</a>&<a href="http://www.tg029.com" target="_blank">众志网</div>
        </div>
    </form>
</body>
</html>


三、C#部分的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BLL;
using System.Web.Security; 

namespace Web.admin
{
    public partial class login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        //登陆按钮
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            //判断验证码是否输入正确
            string code = txtCode.Text.Trim().ToUpper();
            string rightCode = Session["Code"].ToString();
            if (code != rightCode)
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");
                return;
            }

            string name = txtName.Text.Trim();
            string pwd = txtPassword.Text.Trim();

            //把密码转化为MD5码的形式
            pwd = FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "MD5");

            bool b = LoginManager.Login(name, pwd);
            if (b)
            {
                //  登陆成功
                Session["admin"] = name;
                Response.Redirect("categorymanager.aspx");
            }
            else
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('登陆失败,用户名或者密码错误!');</script>");
            }
        }
    }
}


好了,生成验证码的过程大体上就是这样的。效果,预期应该是这样的



可实际上,却是这样的:



为什么?这到底是为什么呢?我可是按着视频上,一步一步地来的,一点没有偷懒啊。老天,不能这样对我吧?

限于文章篇幅,预知后事如何,请看下回分解《验证码的那些事 Ⅱ》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: