欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET ashx实现无刷新页面生成验证码

程序员文章站 2022-06-02 23:29:55
现在大部分网站登陆时都会要求输入验证码,在网上也看了一些范例,现在总结一下如何实现无刷新页面生成验证码。 效果图:   实现方式: 前台: &l...

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

效果图:

 ASP.NET ashx实现无刷新页面生成验证码

实现方式:

前台:

<div>
 <span>identifying code:</span>
 <asp:textbox id="txtvalidationcode" runat="server" width="130px" maxlength="4"></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:

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(4);
  context.session["random"] = s_random;
  s_random = s_random.substring(0, 1) + " " + s_random.substring(1, 1) + " " + s_random.substring(2, 1) + " " + s_random.substring(3, 1);
  
  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 * 18);
  system.drawing.bitmap image = new system.drawing.bitmap(iwidth, 45);
  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 = 0; i < 50; i++)
  {
   int x = rand.next(image.width);
   int y = rand.next(image.height);
   g.drawrectangle(new pen(color.lightgray, 0), x, y, 1, 1);
  }

  //输出不同字体和颜色的验证码字符

  for (int i = 0; i < checkcode.length; i++)
  {
   int cindex = rand.next(7);
   int findex = rand.next(5);
   font font = new system.drawing.font("arial", 24, (system.drawing.fontstyle.bold | system.drawing.fontstyle.italic));
   brush b = new system.drawing.solidbrush(c[cindex]);
   int ii = 4;
   if ((i + 1) % 2 == 0)
   {
    ii = 2;
   }
   g.drawstring(checkcode.substring(i, 1), font, b, 3 + (i * 12), ii);
  }
  //画一个边框

  g.drawrectangle(new pen(color.black, 0), 0, 0, image.width - 1, image.height - 1);

  //输出到浏览器
  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 = 1; i <= vcodenum; i++)
  {
   int inum = 0;
   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方法,从而获取新的验证码】

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