ASP.Net MVC 生成安全验证码(例:用于登陆验证)

---------html      

1
2
3
4
5
6
7
< td >验证码:</ td >
            < td >
                < img  src="/Login/CheckCode?ID=1" id="imgCode" alt="单击可刷新" onclick="ClickRemoveChangeCode()"  />
                < div  style="float:right; margin-top: 5px;">
                    < a  href="javascript:void(0)" onclick="ClickRemoveChangeCode();return false;">看不清,换一张</ a >
                </ div >
            </ td >

 

-----------jquery

1
2
3
4
5
//单击重新改变验证码
function  ClickRemoveChangeCode() {
     var  code = $( "#imgCode" ).attr( "src" );
     $( "#imgCode" ).attr( "src" , code +  "1" );
}   

 

 

------------asp.net mvc 返回文件地址    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>
/// 验证码的校验
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public  ActionResult CheckCode()
{
     //生成验证码
     ValidateCode validateCode =  new  ValidateCode();
     string  code = validateCode.CreateValidateCode(4);
     Session[ "ValidateCode" ] = code;
     byte [] bytes = validateCode.CreateValidateGraphic(code);
     return  File(bytes,  @"image/jpeg" );
}

 

----生成验证码和绘制背景的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public  class  ValidateCode
     {
         public  ValidateCode()
         {
         }
         /// <summary>
         /// 验证码的最大长度
         /// </summary>
         public  int  MaxLength
         {
             get  return  10; }
         }
         /// <summary>
         /// 验证码的最小长度
         /// </summary>
         public  int  MinLength
         {
             get  return  1; }
         }
         /// <summary>
         /// 生成验证码
         /// </summary>
         /// <param name="length">指定验证码的长度</param>
         /// <returns></returns>
         public  string  CreateValidateCode( int  length)
         {
             int [] randMembers =  new  int [length];
             int [] validateNums =  new  int [length];
             string  validateNumberStr =  "" ;
             //生成起始序列值
             int  seekSeek =  unchecked (( int )DateTime.Now.Ticks);
             Random seekRand =  new  Random(seekSeek);
             int  beginSeek = ( int )seekRand.Next(0, Int32.MaxValue - length * 10000);
             int [] seeks =  new  int [length];
             for  ( int  i = 0; i < length; i++)
             {
                 beginSeek += 10000;
                 seeks[i] = beginSeek;
             }
             //生成随机数字
             for  ( int  i = 0; i < length; i++)
             {
                 Random rand =  new  Random(seeks[i]);
                 int  pownum = 1 * ( int )Math.Pow(10, length);
                 randMembers[i] = rand.Next(pownum, Int32.MaxValue);
             }
             //抽取随机数字
             for  ( int  i = 0; i < length; i++)
             {
                 string  numStr = randMembers[i].ToString();
                 int  numLength = numStr.Length;
                 Random rand =  new  Random();
                 int  numPosition = rand.Next(0, numLength - 1);
                 validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
             }
             //生成验证码
             for  ( int  i = 0; i < length; i++)
             {
                 validateNumberStr += validateNums[i].ToString();
             }
             return  validateNumberStr;
         }
 
         //C# MVC 升级版
         /// <summary>
         /// 创建验证码的图片
         /// </summary>
         /// <param name="containsPage">要输出到的page对象</param>
         /// <param name="validateNum">验证码</param>
         public  byte [] CreateValidateGraphic( string  validateCode)
         {
             Bitmap image =  new  Bitmap(( int )Math.Ceiling(validateCode.Length * 12.0), 22);
             Graphics g = Graphics.FromImage(image);
             try
             {
                 //生成随机生成器
                 Random random =  new  Random();
                 //清空图片背景色
                 g.Clear(Color.White);
                 //画图片的干扰线
                 for  ( int  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  Font( "Arial" , 12, (FontStyle.Bold | FontStyle.Italic));
                 LinearGradientBrush brush =  new  LinearGradientBrush( new  Rectangle(0, 0, image.Width, image.Height),
                  Color.Blue, Color.DarkRed, 1.2f,  true );
                 g.DrawString(validateCode, font, brush, 3, 2);
                 //画图片的前景干扰点
                 for  ( int  i = 0; i < 100; i++)
                 {
                     int  x = random.Next(image.Width);
                     int  y = random.Next(image.Height);
                     image.SetPixel(x, y, Color.FromArgb(random.Next()));
                 }
                 //画图片的边框线
                 g.DrawRectangle( new  Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                 //保存图片数据
                 MemoryStream stream =  new  MemoryStream();
                 image.Save(stream, ImageFormat.Jpeg);
                 //输出图片流
                 return  stream.ToArray();
             }
             finally
             {
                 g.Dispose();
                 image.Dispose();
             }
         }
 
         /// <summary>
         /// 得到验证码图片的长度
         /// </summary>
         /// <param name="validateNumLength">验证码的长度</param>
         /// <returns></returns>
         public  static  int  GetImageWidth( int  validateNumLength)
         {
             return  ( int )(validateNumLength * 12.0);
         }
         /// <summary>
         /// 得到验证码的高度
         /// </summary>
         /// <returns></returns>
         public  static  double  GetImageHeight()
         {
             return  22.5;
         }
 
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值