资源描述
沈阳理工大学课程设计专用纸
成 绩 评 定 表
学生姓名
石霖
班级学号
1103050137
专 业
计算机科学与技术
课程设计题目
网站验证码的
设计与实现
评
语
组长签字:
成绩
日期
2013年1月4 日
课程设计任务书
学 院
信息科学与工程学院
专 业
计算机科学与技术
学生姓名
石霖
班级学号
1103050137
课程设计题目
网站验证码的设计与实现
实践教学要求与任务:
为了防止网站被非法登陆,网站一般通过验证码的方式,防止黑客用软件非法登陆。验证码一般采用干扰后的图像显示,人可以识别,但机器识别有困难。本案例用Visual C#.NET开发一个网站的验证码生成软件,并在网页上测试该软件的有效性。
工作计划与进度安排:
第18周
星期一:设计任务分析和总体设计
星期二:软件算法和流程设计
星期三、四、五:软件编码实现
第19周
周一:软件总体调试
周二:软件运行分析
周三:答辩、验收程序
周四:答辩、验收程序
周五:书写课程设计报告,提交
指导教师:
2013年1月4 日
专业负责人:
2013年1月4日
学院教学副院长:
2013年1月4日
目 录
1 需求分析 ………………………………………………………4
2 概要设计 ………………………………………………………4
2.1 题目概述 …………………………………………………4
2.2 功能框图 …………………………………………………4
2.3算法流程图 ………………………………………………4
2.3.1验证码随机数的生成与分配…………………………5
2.3.2证码进行验证…………………………………………6
3 调试结果………………………………………………………6
3.1 ASP.NET主页 ……………………………………………6
3.2登陆主页 …………………………………………………7
4 收获与体会 ………………………………………………………8
5 参考文献 ………………………………………………………8
6 附录 ………………………………………………………9
1 需求分析
网络对现实生活已经产生了非常大的影响,网络带来快捷和方便的同时也产生了许许多多的新问题,例如本案例讨论的安全登录问题。大家都知道网络登录时必须输入正确的验证码才能登录成功,这是因为机器很难识别验证码。本案例就是通过Visual C#.NET语言和实际的操作来研究这一问题。
2 概要设计
2.1 题目概述
防止网站被非法登陆,防止黑客用软件非法登陆,网站要设置验证码。验证码一 般采用干扰后的图像显示,人可以识别,但机器识别有困难。本案例用Visual C#.NET开发一个网站的验证码生成软件,并在网页上实现操作。
2.2 功能框图
网站验证码的设计与实现
输入验证码
验证成功与失败的显示
随机生成验证码
图2.2 总功能框图
2.3 算法流程图
2.3.1验证码随机数的生成与分配
开始
定义验证码VcodeNum
生成验证码
i < VcodeNum + 1
否
是
验证码是否重复
否
是
i++
将验证码写入文件
结束
图 2.3.1 验证码随机数的生成与分配
2.3.2证码进行验证
开始
输入验证码
输入数据与给定验证码是否相等
验证失败!
验证成功
结束
图2.3.2 证码进行验证
3 调试结果
3.1 ASP.NET主页
图4.1 ASP.NET主页
3.2登陆主页
进入登陆主页面
4-2登陆主页
添加用户名、密码、验证码,提交登陆,显示验证成功的信息。
图4-3登陆主页
4收获与体会
一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了宽容,也学会了理解
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
通过这次课程设计,本人在多方面都有所提高生独立工作能力,在这次设计过程中,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教
5 参考文献
《网站验证码的设计与实现》开发案例
6 (附录)代码附录
6.1 网站验证码的生成
<%@ WebHandler Language="C#" Class="ValidateImage" %>
using System;
using System.Web;
using System.IO;
using System.Drawing;
public class ValidateImage : IHttpHandler,
System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest (HttpContext context) {
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
string valid = ""; // 定义随机数字
//生成包含验证码的图片
MemoryStream ms = Create(out valid);
// 存储在session中的验证码,用于验证
context.Session["validateImage"] = valid;
//置空输出流
context.Response.ClearContent();
//输出流格式
context.Response.ContentType = "image/png";
//输出
context.Response.BinaryWrite(ms.ToArray());
context.Response.End();
}
public bool IsReusable {
get {
return false;
}
}
//用来产生2位数的随机数分配的方法
private string RndNum(int VcodeNum)
{
string Vchar = "1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,m,n,p,q" +
",r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
// 拆分到数组中
string[] VcArray = Vchar.Split(new Char[] { ',' });
// 收集随机数
string VNum = "";
// 记录最后随机值,尽量避免同一随机数
int temp = -1;
Random rand = new Random();
// 通过一个简单的算法,以确保不同的随机编号
for (int i = 1; i < VcodeNum + 1; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
}
int t = rand.Next(55);
if (temp != -1 && temp == t)
{
return RndNum(VcodeNum);//如果获得随机数重复,然后递归调用
}
temp = t;
//随机数中位数加一
VNum += VcArray[t];
}
return VNum;
}
// 生成随机数,并将其写入图像文件
public MemoryStream Create(out string VNum)
{
VNum = RndNum(3);
Bitmap Img = null;
Graphics g = null;
MemoryStream ms = null;
System.Random random = new Random();
Color[] c ={ Color.Black, Color.Red, Color.DarkBlue, Color.Green,
Color.Brown, Color.DarkCyan, Color.Purple};
string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
Img = new Bitmap((int)VNum.Length * 18, 32);
g = Graphics.FromImage(Img);
g.Clear(Color.White);
// 在背景的随机位置画图
for (int i = 0; i < 100; i++)
{
int x = random.Next(Img.Width);
int y = random.Next(Img.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
}
// 在g中映射验证码
for (int i = 0; i < VNum.Length; i++)
{
int cindex = random.Next(6);
int findex = random.Next(5);
// 格式
Font f = new System.Drawing.Font(fonts[findex], 15, System.Drawing.FontStyle.Regular);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
int ii = 4;
if ((i + 1) % 2 == 0) // 控制不同验证码字符在垂直方向上的位置
{
ii = 2;
}
g.DrawString(VNum.Substring(i, 1), f, b, 3 + (i * 12), ii);
}
ms = new MemoryStream();
Img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
Img.Dispose();
return ms;
}
}
6.2 验证码的验证
查看输入的验证码与电脑是否匹配
protected void Button1_Click(object sender, EventArgs e)
{
if (TextBox3.Text == Session["validateImage"].ToString())
{
Response.Write("验证成功!" + TextBox3.Text);
Response.Write("用户名为:" + TextBox1.Text);
else
{
Response.Write("验证失败!" + TextBox3.Text + "--->" + Session["validateImage"]);
}
}
沈阳理工大学 12
展开阅读全文