现在大部分网站登陆时都会要求输入验证码,在网上也看了一些范例,现在总结一下如何实现无刷新页面生成验证码。

效果图:

实现方式:

前台:

 <div>
<span>Identifying Code:</span>
<asp:TextBox ID="txtValidationCode" runat="server" Width="130px" MaxLength=""></asp:TextBox>
<img id="imgYZ" class="code" style=" height:23px; width:65px;"
src="Img.ashx" onclick="this.src=this.src+'?'"/ />
<img src="../images/btn_change.gif" title="Change" class="btn_change" Style="cursor: hand"
onclick="ImgChange()" />
</div>

JS:

 <script language="javascript" type="text/javascript">
function ImgChange()
{
var img=document.getElementById("imgYZ");
img.click();
}
</script>

ashx:

 <%@ WebHandler Language="C#" Class="Img" %>

 using System;
using System.Web;
using CLAIMS.BLL;
using System.Data;
using System.Configuration;
using System.Web.SessionState;
using System.Drawing; public class Img : IHttpHandler, IRequiresSessionState
{ public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "image/Jpeg"; string s_random = "";
System.IO.MemoryStream ms = new System.IO.MemoryStream();
s_random = RndNum();
context.Session["random"] = s_random;
s_random = s_random.Substring(, ) + " " + s_random.Substring(, ) + " " + s_random.Substring(, ) + " " + s_random.Substring(, ); CreateImage(s_random, ref ms);
context.Response.ClearContent();
context.Response.BinaryWrite(ms.ToArray()); context.Response.Flush();
context.Response.End();
} private void CreateImage(string checkCode,ref System.IO.MemoryStream ms)
{
int iwidth = (int)(checkCode.Length * );
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, );
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定义字体
//string[] font = {"Verdana","Microsoft Sans Serif","Comic Sans MS","Arial","宋体"};
Random rand = new Random();
//随机输出噪点
for (int i = ; i < ; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, ), x, y, , );
} //输出不同字体和颜色的验证码字符 for (int i = ; i < checkCode.Length; i++)
{
int cindex = rand.Next();
int findex = rand.Next();
Font font = new System.Drawing.Font("Arial", , (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
Brush b = new System.Drawing.SolidBrush(c[cindex]);
int ii = ;
if ((i + ) % == )
{
ii = ;
}
g.DrawString(checkCode.Substring(i, ), font, b, + (i * ), ii);
}
//画一个边框 g.DrawRectangle(new Pen(Color.Black, ), , , image.Width - , image.Height - ); //输出到浏览器
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); g.Dispose();
image.Dispose();
} public static String RndNum(int VcodeNum)
{
String Vchar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
String[] VcArray = Vchar.Split(',');
String VNum = "";
Random random = new Random();
for (int i = ; i <= VcodeNum; i++)
{
int iNum = ;
while ((iNum = Convert.ToInt32(VcArray.Length * random.NextDouble())) == VcArray.Length)
{
iNum = Convert.ToInt32(VcArray.Length * random.NextDouble());
}
VNum += VcArray[iNum];
}
return VNum;
} public bool IsReusable {
get {
return false;
}
} }

备注:

onclick="this.src=this.src+'?'"

之前一直不明白为什么要加一个?号,于是去网上搜索,参考一下前辈们的见解:

【这是表示当前图片链接,在当前链接值的基础上添加了一个问号
譬如当前src="check.aspx",点击后就变成了"check.aspx?",继续点就会变成"check.aspx?????"
这个问号是没有实际意义的,它唯一的作用是向IE表明: 图片链接发生了变化,图片需要刷新.】

【GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。
this.src=this.src+'?'是将this.src原值后加上?,以便向服务器发送一个新的GET方法,从而获取新的验证码】

感恩前辈们的分享,我会向你们学习,把分享的精神传递给身边更多的人。

ASP.NET ashx实现无刷新页面生成验证码的更多相关文章

  1. 只需要4步就可以将asp.net mvc变成SPA(单页面)应用,实现无刷新页面切换!

    SENNA.js Senna.js是一个超快速的单页面应用程序引擎,轻松构建基于Web的现代应用程序,只有大约8KB的JavaScript而没有任何依赖性.还提供非常酷炫的动画效果.想要详细了解的朋友 ...

  2. ASP.NET—015:ASP.NET中无刷新页面实现

    原文作者:杨友山 原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/39679823 前面也说过在asp.net中前后前交互的 ...

  3. 使用AJAX做关键字查询:输入框变化自动搜索、无刷新页面;

    使用AJAX做关键字查询要求:1.无刷新页面2.输入框变化自动搜索 <style type="text/css"> .k{ width:150px; height:30 ...

  4. Ajax 实现无刷新页面

    注意:如本文所用,在前面的文章库的数目可以在源代码中找到,我将指示在文本,其中链路,为了缩短制品的长度,阅读由此带来的不便.乞求被原谅. 评论文章 Ajax 实现无刷新页面.其原理.代码库.代码. 这 ...

  5. JSF中使用f:ajax标签无刷新页面改变数据

    ajax本是用在前端的一种异步请求数据的操作,广泛用于js中,一般的js框架如jq都有被封装好的方法,用于发起异步请求操作.异步操作可以增强用户体验和操作,越来越多的程序都在使用ajax.JSF的fa ...

  6. Asp:Button控件onclick事件无刷新页面提示消息

    <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptMana ...

  7. Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现

    简单三步实现图片无刷新上传:注意是上传,至于上传时的验证,比如图片的尺寸,大小,格式判断.限制等,自行解决. 兼容性想还不错:FF,CH,IE,猎豹,都是可以实现的.如果看到回显.当然就是成功了. 经 ...

  8. ASP.NET MVC3实现无刷新验证码

    在MVC中进行留言,评论等功能时,不可避免会用到表单提交时的验证码问题,有时,我们的作法是,当表单被提交后,在controller里去判断验证码的正确与否,但我认为这种用户体验是很差的,今天正好有后时 ...

  9. PHP + JavaScript + Ajax 实现无刷新页面加载效果

    数据源工厂 Json生成方式1 Json生成方式2 数据搬运工 数据加工师 转换类型 加工展示 结果展示 初始页面 点击按钮之后 总结 今天这个实验的思路就是实现一个无刷新的页面加载效果.具体的思路是 ...

随机推荐

  1. springMVC: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config

    springMVC开发web的时候,报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 原因:未引入jstl ...

  2. redis集群讨论

    一.生产应用场景 二.存储架构演变 三.应用最佳实践 四.运维经验总结 第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性 ...

  3. modelsim(3) - summary ,issue,tips

    1) the OEM of modelsim is 10 times slower than offical questa 2)how to the file full path in the mod ...

  4. 8天掌握EF的Code First开发系列之5 视图、存储过程和异步API

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 视图View 存储过程 异步API 本章小结 咱们接着上一篇继续深入学习,这一篇说说Entity Framewo ...

  5. XidianOJ 1154 Nhywieza 的串

    题目描述 输入 输出 对于每组数据输出 1 行,表示最少的操作次数. --正文 找到连续的0一起变就好 #include <iostream> #include <cstring&g ...

  6. Python: 列表的基本用法

    列表是可变的,可以改变的序列,它能够保存任何数据类型. >>> list = []        #定义一个空列表>>> list.append(1)        ...

  7. wamp 配置遇到的问题

    /* 最近开发部署更换到国内的服务器,想来想去还是更换为wamp套件. 但是由于下的版本的都不太适合. 外网一直显示拒绝.排查问题之后 写个笔记做个记录 */ wamp You don't have ...

  8. 初学JQuery笔记

    extend()函数是jQuery的基础函数之一,作用是扩展现有的对象 <script type="text/javascript" src="jquery-1.5 ...

  9. Cocos学习-----Cocos2Dx安装

    昨天晚上从官网下载了cocos2dx,打开发现win下工程已经是2010了最少,很是郁闷.尝试着在08下新建工程然后添加文件,发现还是很麻烦,于是下载了vs2010,打开编译报错:error C206 ...

  10. Qt链接网站SLOT

    void BottomToolWidget::openLink() { QString link = "http://www.baidu.com";//在.h中添加slot声明,在 ...