zoukankan      html  css  js  c++  java
  • 简单C#、asp.net mvc验证码的实现

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text;
    using System.Drawing;
    using System.IO;

    namespace 验证码的实现.ValidateCode
    {
    /// <summary>
    /// 验证码生成工具类
    /// </summary>
    ///

     
    public class ValidateCodeHelper
    {
    private static Random rand = new Random();
    private static string code;
    /// <summary>
    /// 随机生成指定长度的验证码
    /// </summary>
    /// <param name="length"></param>
    /// <returns></returns>
    public static string GetCode(int length) {

    string codes = "AaBbCcDdEeFfJjHhIiJjKkMmNnPpQrRSsTtUuVvWwXxYyZz0123456789";



    StringBuilder sb = new StringBuilder();
    for (int i = 0; i <length; i++)
    {
    int index=rand.Next(codes.Length);
    if (sb.ToString().Contains(codes[index])) {

    i--;
    continue;
    }
    sb.Append(codes[index]);
    }
    code = sb.ToString();
    return code;

    }

    /// <summary>
    /// 获取随机颜色
    /// </summary>
    /// <returns></returns>
    private static Color GetRandomColor() {


    int red = rand.Next(10, 255);
    int green = rand.Next(10, 255);
    int blue = rand.Next(10, 255);

    return Color.FromArgb(red, green, blue);
    }

    /// <summary>
    /// 生成验证码
    /// </summary>
    /// <returns></returns>
    public static byte[] ValidateCode(string code) {

    Bitmap img = new Bitmap(100,30);
    Graphics g = Graphics.FromImage(img);
    g.FillRectangle(Brushes.White, 0, 0, img.Width, img.Height);
    g.DrawRectangle(new Pen(Color.Black), 1, 1, img.Width-2, img.Height-2);
    Brush bush = new SolidBrush(Color.SteelBlue);
    g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2);
    Random r = new Random();
    //画线条
    for (int i = 0; i < 5; i++)
    {
    g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height));
    }
    //画躁点
    for (int i = 0; i < 100; i++)
    {
    img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor());
    }
    MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

    byte[] data = ms.GetBuffer();
    g.Dispose();
    ms.Close();
    return data;
    }

    /// <summary>
    /// 生成验证码
    /// </summary>
    /// <param name="code">验证码</param>
    /// <param name="fontColor">验证码颜色</param>
    /// <returns></returns>
    public static byte[] ValidateCode(string code,Color fontColor) {

    Bitmap img = new Bitmap(100,30);
    Graphics g = Graphics.FromImage(img);

    g.FillRectangle(Brushes.White,0, 0, img.Width, img.Height);

    Brush bush = new SolidBrush(fontColor);
    g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2);
    Random r = new Random();
    //画线条
    for (int i = 0; i < 5; i++)
    {
    g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height));
    }
    //画躁点
    for (int i = 0; i < 100; i++)
    {
    img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor());
    }
    MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

    byte[] data = ms.GetBuffer();
    g.Dispose();
    ms.Close();
    return data;
    }
    /// <summary>
    /// 生成验证码
    /// </summary>
    /// <param name="code">验证码</param>
    /// <param name="fontColor">验证码颜色</param>
    /// <param name="backgroundColor">验证码背景颜色</param>
    /// <returns></returns>
    public static byte[] ValidateCode(string code,Color backgroundColor, Color fontColor)
    {

    Bitmap img = new Bitmap(100, 30);
    Graphics g = Graphics.FromImage(img);
    Brush bush1 = new SolidBrush(backgroundColor);
    g.FillRectangle(bush1, 0, 0, img.Width, img.Height);
    Brush bush = new SolidBrush(fontColor);
    g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2);
    Random r = new Random();
    //画线条
    for (int i = 0; i < 5; i++)
    {
    g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height));
    }
    //画躁点
    for (int i = 0; i < 100; i++)
    {
    img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor());
    }
    MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

    byte[] data = ms.GetBuffer();
    g.Dispose();
    ms.Close();
    return data;
    }

    /// <summary>
    /// 判断验证码是否正确
    /// </summary>
    /// <param name="Code"></param>
    /// <returns></returns>
    public static bool IsValidate(string Code) {

    if (string.IsNullOrEmpty(Code)||!code.ToLower().Equals(Code.ToLower())) {

    return false;
    }

    return true;
    }
    }
    }

    在控制器中的调用

    public ActionResult ValidateCode(){

    //获取指定长度验证码

    string code= ValidateCodeHelper.GetCode(5);
    TempData["code"] = code;//存储验证码用于验证

    //将验证码绘制到图片上、保存到内存流中并返回字节数组
    byte[] data= ValidateCodeHelper.ValidateCode(code);

    return File(data,"image/jpeg");
    }

    在前端的调用

    <script>


    function change() {

    var img = document.getElementsByTagName('img')[0];

    img.src = img.src + "?";

    }
    </script>
    <form method="post" action="/Home/Login">
    <table>
    <tr>
    <td>验证码:</td>
    <td><img src="/Home/ValidateCode" style="cursor:pointer" onclick="this.src =this.src+'?'" />
    <a href="javascript:void(0)" onclick="change()">换一张</a>
    </td>
    </tr>
    <tr>
    <td>输入验证码:</td>
    <td><input type="text" name="code"/></td>
    </tr>
    </table>
    <input type="submit" value="提交"/>
    </form>

  • 相关阅读:
    [bzoj4408][Fjoi2016]神秘数
    BZOJ1102: [POI2007]山峰和山谷Grz
    BZOJ1098: [POI2007]办公楼biu
    BZOJ1097: [POI2007]旅游景点atr
    GDOI2018 新的征程
    BZOJ2084: [Poi2010]Antisymmetry
    回文树详解
    Codeforces739E. Gosha is hunting
    一道题17
    LOJ#6002. 「网络流 24 题」最小路径覆盖
  • 原文地址:https://www.cnblogs.com/zzjbk/p/5573434.html
Copyright © 2011-2022 走看看