当前位置: 移动技术网 > IT编程>开发语言>.net > MVC+EasyUI+三层新闻网站建立 验证码生成(三)

MVC+EasyUI+三层新闻网站建立 验证码生成(三)

2017年12月08日  | 移动技术网IT编程  | 我要评论

锵锵三人行 马伊俐,中国市长 纪录片,农业天地

我们在项目中的newweb.common类库里面建立一个类用来存放生成验证码的代码。

这里我类的名字叫 validatecode

生成验证码(validatecode)类的代码:

using system;
using system.collections.generic;
using system.drawing;
using system.drawing.drawing2d;
using system.drawing.imaging;
using system.io;
using system.linq;
using system.text;
using system.threading.tasks;
using system.web;

namespace newweb.common
{
  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;
      }
      /// <summary>
      /// 创建验证码的图片
      /// </summary>
      /// <param name="context">要输出到的page对象</param>
      /// <param name="validatenum">验证码</param>
      public void createvalidategraphic(string validatecode, httpcontext context)
      {
        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);
          //输出图片流
          context.response.clear();
          context.response.contenttype = "image/jpeg";
          context.response.binarywrite(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;
      }


      //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();
        }
      }
    }
  
}

这时需要在程序中引入两个命名空间 system.drawing和system.web。

完成之后到logincontroller控制器里面去新建一个actionresult   就叫validatecode 用于生成验证码。(这里要先对newweb.common引用)

生成验证码代码如下:

 public actionresult validatecode()
    {
      common.validatecode validatecode = new common.validatecode();
      string code = validatecode.createvalidatecode(4); //生成的验证码4个长度
      session["validatecode"] = code;
      byte[] buffer = validatecode.createvalidategraphic(code);//创建验证码图片
      return file(buffer, "image/jpeg");//返回图片
    }

到login视图里面的index页面去把img的src补充为:

 <tr>
   <td style="width:20px"></td>
    <td><img id="image" src="/login/validatecode/?id=1" style="float: left; height: 24px;" /></td>
    <td><a href="javascript:void(0)" onclick="changecheckcode();return false;">看不清,换一张</a></td>
</tr>

就可以看到页面上面显示出来验证码

下面要做的就是点击切换验证码,这是通过js实现的代码

 <script type="text/javascript">
    $(function () {
      
      initwin(); //初始化登录窗体
      changecheckcode(); //切换验证码
    });
    function initwin() {
      $("#win").window({
        title: "登录",
        width: 400,
        height: 270,
        collapsible: false,
        minimizable: false,
        maximizable: false,
        closable: false,
        modal: true,
        resizable: false,
      });
      
    }
    //切换验证码
    function changecheckcode() {
      $("#changevcode").click(function () {
        $("#image").attr("src", $("#image").attr("src") + 1);
      });
    }
  </script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网