在mvc中实现图片验证码的刷新

首先,在项目模型(Model)层中建立一个生成图片验证码的类ValidationCodeHelper,代码如下:

 public class ValidationCodeHelper
    {
        //用户存取验证码字符串
        public string validationCode = String.Empty;
        Random ram = new Random();
        Graphics g = null;

        int bgWidth = 0;
        int bgHeight = 0;

        public string FontFace = "Consolas";
        public int FontSize = 16;
        public Color foreColor = Color.FromArgb(190, 190, 190);
        public Color backColor = Color.FromArgb(0, 120, 120);
        public Color mixedLineColor = Color.FromArgb(220, 220, 220);
        public int mixedLineWidth = 1;
        public int mixedLineCount = 3;

        #region 根据指定长度,返回随机验证码
        /// <summary>
        /// 根据指定长度,返回随机验证码
        /// </summary>
        /// <param name="length">制定长度</param>
        /// <returns>随即验证码</returns>
        public string Next(int length)
        {
            this.validationCode = GetRandomCode(length);
            return this.validationCode;
        }
        #endregion

        #region 根据指定长度及背景图片样式,返回带有随机验证码的图片对象
        /// <summary>
        /// 根据指定长度及背景图片样式,返回带有随机验证码的图片对象
        /// </summary>
        /// <param name="length">指定长度</param>
        /// <param name="hatchStyle">背景图片样式</param>
        /// <returns>Image对象</returns>
        public Image NextImage(int length, bool allowMixedLines,out string code)
        {
            this.validationCode = GetRandomCode(length);
            code = this.validationCode;
            //System.Web.HttpContext.Current.Session["Code"] = validationCode;
            //校验码字体
            Font myFont = new Font(FontFace, FontSize);

            //根据校验码字体大小算出背景大小
            bgWidth = (int)myFont.Size * length + 4;
            bgHeight = (int)myFont.Size * 2;
            //生成背景图片
            Bitmap myBitmap = new Bitmap(bgWidth, bgHeight);

            g = Graphics.FromImage(myBitmap);

            this.DrawBackground();
            this.DrawValidationCode(this.validationCode, myFont);
            if (allowMixedLines)
                this.DrawMixedLine();

            return (Image)myBitmap;
        }
        #endregion

        #region 内部方法:绘制验证码背景
        private void DrawBackground( )
        {
            //设置填充背景时用的笔刷
            HatchBrush hBrush = new HatchBrush(HatchStyle.Wave, backColor);

            //填充背景图片
            g.FillRectangle(hBrush, 0, 0, this.bgWidth, this.bgHeight);
        }
        #endregion

        #region 内部方法:绘制验证码
        private void DrawValidationCode(string vCode, Font font)
        {
            g.DrawString(vCode, font, new SolidBrush(this.foreColor), 2, 2);
        }
        #endregion

        #region 内部方法:绘制干扰线条
        /// <summary>
        /// 绘制干扰线条
        /// </summary>
        private void DrawMixedLine()
        {
            for (int i = 0; i < mixedLineCount; i++)
            {
                g.DrawBezier(
                    new Pen(new SolidBrush(mixedLineColor),mixedLineWidth),
                    RandomPoint(),
                    RandomPoint(),
                    RandomPoint(),
                    RandomPoint()
                );
            }
        }
        #endregion

        #region 内部方法:返回指定长度的随机验证码字符串
        /// <summary>
        /// 根据指定大小返回随机验证码
        /// </summary>
        /// <param name="length">字符串长度</param>
        /// <returns>随机字符串</returns>
        private string GetRandomCode(int length)
        {
            StringBuilder sb = new StringBuilder(6);

            for (int i = 0; i < length; i++)
            {
                sb.Append(Char.ConvertFromUtf32(RandomAZ09()));
            }

            return sb.ToString();
        }
        #endregion

        #region 内部方法:产生随机数和随机点

        /// <summary>
        /// 产生0-9A-Z的随机字符代码
        /// </summary>
        /// <returns>字符代码</returns>
        private int RandomAZ09()
        {
            //Thread.Sleep(15);
            int result = 48;

            int i = ram.Next(2);

            switch (i)
            {
                case 0:
                    result = ram.Next(48, 58);
                    break;
                case 1:
                    result = ram.Next(65, 91);
                    break;
            }

            return result;
        }

        /// <summary>
        /// 返回一个随机点,该随机点范围在验证码背景大小范围内
        /// </summary>
        /// <returns>Point对象</returns>
        private Point RandomPoint()
        {
            //Thread.Sleep(15);

            Point point = new Point(ram.Next(this.bgWidth), ram.Next(this.bgHeight));
            return point;
        }
        #endregion
    } 

然后,在控制器(Controller)中创建一个控制器名称为ValidateCodeImgController的.cs文件,写入以下方法。

这个方法用来返回一个图像对象:

        public ActionResult Get()
        {
            ValidationCodeHelper vCode = new ValidationCodeHelper();
            string code;
            Image imgcode = vCode.NextImage(4,true,out code);

            //使用Session进行储存
            this.TempData["Code"] = code;  

            //创建存储区为内存的流(关闭程序后,数据会被自动回收)
            MemoryStream ms = new MemoryStream();

            //将此图像以指定的格式保存到指定的流中
            imgcode.Save(ms,ImageFormat.Gif);

            this.Response.ContentType = "image/gif";
            this.Response.BinaryWrite(ms.ToArray());
            ms.Close();
            imgcode.Dispose();

            return new EmptyResult();
        } 

最后,视图(View)中显示:

js代码:

<script type="text/javascript">
    function imgCodes() {
        $("#valiCode").attr("src", ‘@Url.Action("Get", "ValidateCodeImg")‘+"?time="+(new Date()).getTime());
    }
</script>

html代码:

<td height="35" class="login-text02">
    验证码:<br />
</td>
<td>
    <div style="width:400px;">
    <input type="text" name="txtCheck" />&nbsp;&nbsp;&nbsp;
    <img id="valiCode" style="cursor: pointer;" src="/ValidateCodeImg/Get" title="看不清,点击换一张" alt="看不清?请点我" onclick="imgCodes(this);" />
    &nbsp;&nbsp;
    <a href="javascript:imgCodes();">看不清楚,点击这里</a>

    </div>
</td>

显示效果如下图:

注意:根据这段html代码,如果要刷新图片验证码,可以直接点击验证码图片也可以a标签。

时间: 2024-08-26 06:58:21

在mvc中实现图片验证码的刷新的相关文章

【Nodejs项目手记】Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

django项目登录中使用图片验证码

应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code_img(request): # 方式: from PIL import Image, ImageDraw, ImageFon

Struts2中的图片验证码

1.Struts中建一个action <action name="Code" class="LoginAction" method="code"> <result name="success" type="stream"> <param name="contentType">image/jpeg</param> <param name

java中注册图片验证码

package org.servlet.demo; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.charset.Charset; import java.util.Random; im

ASP.NET图片验证码学习!

1. 新建一个Validate.aspx,然后在Validate.aspx.cs编写代码: using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Web;using System.Drawing;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;

struts向网页输出图片验证码

前言:今天做个功能需要展示图片到页面,并不是下载,在网上搜了老半天,大部分都是下载,有的话也是只能在IE下进行输出,其它浏览器就都是下载了. Action代码: [java] view plain copy print? public String processImage(){ String key = ServletActionContext.getRequest().getParameter("key"); if(StringUtils.isEmpty(key)){ return

基于spring mvc的图片验证码实现

基于spring mvc的图片验证码实现 标签: springmvcspring mvc验证码验证码验证 2016-01-28 10:49 8015人阅读 评论(4) 收藏 举报  分类: 表单处理 版权声明:本文为博主原创文章,未经博主允许不得转载. 本文实现基于spring mvc的图片验证码,分后台代码和前端页面的展现以及验证码的验证. 首看后台实现代码: @RequestMapping({"authCode"}) public void getAuthCode(HttpServ

ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

转载  http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET_Web_Form_MVC.html 什么是刷新/重新载入 IE中的刷新(Refresh),在FF和Chrome中称为重新载入(Reload),与正常进入页面的区别在于以下两点: 1. 缓存控制 如果文件(比如图片)在本地缓存中已经存在,正常进入页面会不访问服务器而直接从本地加载.而对于刷新操作,

ASP.NET MVC 模块与组件(二)——定制图片验证码

 本着简洁直接,我们就直奔主题吧! 下面是一个生成数字和字母随机组合的验证码类源代码: using System; using System.Drawing; using System.Drawing.Imaging; using System.Web.UI; using System.Drawing.Drawing2D; using System.IO; namespace Forcheng.Code { /// <summary> /// 生成验证码的类 /// </summary&