<%@ page contentType="text/html; charset=gb2312"%> AJAX+jsp无刷新验证码实例
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
AJAX+jsp无刷新验证码实例
     发布者:o0 发布时间:2007-03-30
  1. 我们在做验证码的时候往往由于要反作弊,验证有时故意加入多的干扰因素,这时验证码显示不很清楚,用户经常输入错误。这样不但要重新刷新页面,导致用户没有看清楚验证码而重填而不是修改,而且如果没有用session保存下用户输入的其它数据的话(如姓名),用户刚刚输入的内容也不存在了,这样给用户造成不好的体验。
  2. 本例在原有验证方式基础之上增加一段js,通过xmlhttp来获取返回值,以此来验证是否有效,这样即使用户浏览器不支持js,也不会影响他的正常使用了。
  3. 为了防止作弊,当用户连接3次输入错误时则重载一下图片,这样也利于用户因为图片上的验证码辨认不清而使终无法输入正确。
  4. 本例还特别适合检验用户名是否有效,只要从后台做个sql查询,返回一个值或是xml即可。(这种例子太多 ,就在此不赘述了)。
  5. 本例的优点在于非常方便用户输入,而且减少对服务器端的请求,可以说既改善用户体验而且略会节省带宽成本,但相应地要在页面上增加一段JavaScript代码,在目前网速越来越快人们要求便捷舒适的今天,似乎我们更应注意提供给用户良好的使用感受。

代码如下,

1,img.jsp,输入主页面

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" pageEncoding="GBK"%>

<%

//set Chinese Char

//Cody by JarryLi@gmail.com;

//homepage:jiarry.126.com

request.setCharacterEncoding("GBK");

response.setCharacterEncoding("GBK");

response.setContentType("text/html; charset=GBK");

%>

<html>

<head>

<title>图片验证</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<script src="net.js"></script>

</head>

<body>

AJAX(无刷新及时提示)验证码实例!cody by jarry

<hr>

<%

String num=request.getParameter("num");

String random=(String)session.getAttribute("random");

String name=request.getParameter("name");

if(num!=null&&random!=null&&name!=null)

{

 if(num.equals(random))

 {  

  out.println("<font style=\"color:green;font-weight:bold\">恭喜您,验证码输入成功,这里是提交结果页面,可以写入数据库了!</font> <a href=\"img.jsp\">返回再测试</a><br>");

  out.println("您的名字是:"+name);

  out.println("<br>");

  out.println("您输入的是:"+num);

  out.println("验证码是:"+random);

  out.println("</body>");

   return;//javascript:history.go(-1)

  }

}

%>

<script type="text/javascript">

var times=0;

function subform(){

 var gtext=this.req.responseText;

  var info=document.getElementById("info");

  if(gtext.indexOf("validate_successful")!=-1){

   //info.innerHTML="<font color=green>验证码通过</font>";

   document.forms["myform"].submit();

   //当得到的值表示合法,则验证码通过。

  }else{

      times++;

    if(times>=3){//如果连接3次输入错误,则重载图片,可以防止作弊和用户看不清图片;

     info.innerHTML="接连3次输入错误。更新验证码,请重新输入";

       document.forms["myform"].num.value="";
  show(document.getElementById('random'));

       times=0;

     }else{

     info.innerHTML="第"+times+"次验证码错误,请注意区分大小写 ";

   }

  document.forms["myform"].num.select();

  }

}

function validata(obj){

 var enter=true;

 var info=document.getElementById("info");

 var msg="";

 if(obj.name.value.match(/^\s*$/g)){//如果未输入名字,提示

  msg+="请输入您的姓名<br>";enter=false

 }

 if(obj.num.value.match(/^\s*$/g)){//如果未输入验证码,提示

  msg+="请输入验证码<br>";enter=false  

 }

 if(enter==false){

    info.innerHTML=msg;

    return false;

 }

 var url="num.jsp?num="+obj.num.value;

 var newxmlhttp=new net.ContentLoader(url,subform,"","get",null,null);

 return false;

}

function show(o){

 //重载验证码

 var timenow = new Date().getTime();

 o.src="random.jsp?d="+timenow;

 /*

 //超时执行;

 setTimeout(function(){

  o.src="random.jsp?d="+timenow;

 }

  ,20);

  */

}

</script>

 <form action="img.jsp" name="myform" method="post" onsubmit="return validata(this);">

您的姓名:<input type="text" name="name" size=10> (为了更好地说明此例,特加姓名一项)<br>

验 证 码:<input type="text" name="num" size=10 maxlength="4"> <img src="random.jsp" id="random" align="" valign="absmiddle" hspace="5"> <a href="javascript:show(document.getElementById('random'))">验证码看不清</a><br>

<br> <input type="submit" value=" 提交 "><br>

 <div id=info style="color:red;padding:10px;font-size:12px;"></div>

</form>

</body>

</html>

2,num.jsp,反馈xmlhttp请求的页面

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" pageEncoding="GBK"%>

<%

//set Chinese Char

//Cody by JarryLi@gmail.com;

//homepage:jiarry.126.com

request.setCharacterEncoding("GBK");

response.setCharacterEncoding("GBK");

response.setContentType("text/html; charset=GBK");

%>

<%

String num=request.getParameter("num");

String random=(String)session.getAttribute("random");

if(num!=null&&random!=null)

{

 if(!num.equals(random))

 {

 /*

  out.println("<script>alert('验证码错误!请重试。')</script>");

  out.println("<script>history.go(-1)</script>");

  //response.sendRedirect("img.jsp");

  */

  out.print("validate_failed:"+random);

 }

 else

  {
 //out.println("<center>验证成功!</center>");

  out.print("validate_successful:"+random);

  }

}

%>

3,random.jsp,生成验证码图片的页面

<%@ page autoFlush="false"  import="java.util.*,java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.*" %>

<%

//set Chinese Char

//Cody by JarryLi@gmail.com;

//homepage:jiarry.126.com

request.setCharacterEncoding("GBK");

response.setCharacterEncoding("GBK");

response.setContentType("text/html; charset=GBK");

%>

<%

String chose="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

char display[]={'0',' ','0',' ','0',' ','0'},ran[]={'0','0','0','0'},temp;

Random rand=new Random();

for(int i=0;i<4;i++)

{

 temp=chose.charAt(rand.nextInt(chose.length()));

 display[i*2]=temp;

 ran[i]=temp;

 }

 

String random=String.valueOf(display);

session.setAttribute("random",String.valueOf(ran));

 %>

<%

        out.clear();

        response.setContentType("image/jpeg");

        response.addHeader("pragma","NO-cache");

        response.addHeader("Cache-Control","no-cache");

        response.addDateHeader("Expries",0);

        int width=80, height=30;

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        Graphics g = image.getGraphics();

        //以下填充背景颜色

        g.setColor(Color.GREEN);

        g.fillRect(0, 0, width, height);

       //设置字体颜色

        g.setColor(Color.RED);

        Font font=new Font("Arial",Font.PLAIN,20);

        g.setFont(font);

        //g.drawString(random,5,14);

        g.drawString(random,5,20);

        g.dispose();

        ServletOutputStream outStream = response.getOutputStream();

        JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(outStream);

        encoder.encode(image);

        outStream.close();

   %>

4,net.js,封装好的xmlhttp对象,可以很方便的调用

/* namespacing object */

var net=new Object();

 

net.READY_STATE_UNINITIALIZED=0;

net.READY_STATE_LOADING=1;

net.READY_STATE_LOADED=2;

net.READY_STATE_INTERACTIVE=3;

net.READY_STATE_COMPLETE=4;

/*--- content loader object for cross-browser requests ---*/

net.ContentLoader=function(url,on_load,on_error,method,params,contentType){

  this.req=null;

  this.on_load=on_load;

  this.on_error=(on_error) ? on_error : this.defaultError;

  this.loadXMLDoc(url,method,params,contentType);

}

net.ContentLoader.prototype.loadXMLDoc=function(url,method,params,contentType){

  if (!method)

  {

 method="GET";

  }

  if (!contentType && method=="POST")

  {

 contentType='application/x-www-form-urlencoded';

  }

  if (window.XMLHttpRequest)

  {

 this.req=new XMLHttpRequest();

  }

  else if (window.ActiveXObject)

  {

   //add try catch;

   try {

      this.req = new ActiveXObject("Msxml2.XMLHTTP");

   }catch (e1){

     try {

      this.req = new ActiveXObject("Microsoft.XMLHTTP");     

      } catch (e2){

    }

   }

     //

 //this.req=new ActiveXObject("Microsoft.XMLHTTP");

  }

  if (this.req)

  {

 try

 {

   var loader=this;

   this.req.onreadystatechange=function()

   {

  net.ContentLoader.onReadyState.call(loader);

   }

   this.req.open(method,url,true);

   if (contentType)

   {

    this.req.setRequestHeader('Content-Type', contentType);

   }

   this.req.send(params);

 }

 catch (err)

 {

   this.on_error.call(this);

 }

  }

}

net.ContentLoader.onReadyState=function(){

  var req=this.req;

  var ready=req.readyState;

  if (ready==net.READY_STATE_COMPLETE){

 var httpStatus=req.status;

 if (httpStatus==200 || httpStatus==0){

   this.on_load.call(this);

 }else{

   this.on_error.call(this);

 }

  }

}

net.ContentLoader.prototype.defaultError=function(){

  alert("error fetching data!"

 +"\n\nreadyState:"+this.req.readyState

 +"\nstatus: "+this.req.status

 +"\nheaders: "+this.req.getAllResponseHeaders());

}

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
AJAX新技术借Web应用
JS中document对象详解
Axis 1.1 for Java进行Web Services开发
利用WSDL2JAVA实现JAVA调用.Net的Web Services
用Axis开发基于Java的Web服务
Java RPC通信机制之SOAP
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(9928)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(8235)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(4532)
        
回复:ajax jsp无刷新验证码实例
新译通翻译公司成立于1997年,经过多年的发展,已经成为中国最具权威的专业翻译公司之一,专业提供英语翻译、日语翻译、德语翻译、法语翻译、俄语翻译、韩语翻译、阿拉伯语翻译等的大型翻译公司! 新译通上海翻译公司是知名品牌上海翻译公司,凭借我们团队的不断努力,已成为世界大型公司选择上海翻译公司的首选.北京翻译公司.
        
回复:ajax jsp无刷新验证码实例
新译通翻译公司成立于1997年,经过多年的发展,已经成为中国最具权威的专业翻译公司之一,专业提供英语翻译、日语翻译、德语翻译、法语翻译、俄语翻译、韩语翻译、意大利语翻译、葡萄牙语翻译、西班牙语翻译、阿拉伯语翻译等的大型翻译公司! ... 新译通上海翻译公司是知名品牌上海翻译公司,凭借我们团队的不断努力,已成为世界大型公司选择上海翻译公司的首选.北京翻译公司
        
回复:ajax jsp无刷新验证码实例
采用全硅溶胶脱蜡精密铸造工艺生产出口不锈钢、碳钢和低合金钢精密铸造及其制品等。具有年产800吨铸件的精密铸造生产能力。杭州晨晨婚庆公司是一家从事杭州婚庆服务的专业机构,杭州婚庆车队,杭州婚庆主持策划.
        
回复:ajax jsp无刷新验证码实例
电磁阀; 过滤器; 液位计; 呼吸阀; 阻火器; 排气阀; 柱塞阀; 疏水阀; 旋塞阀; 安全阀; 平衡阀; 针型阀; 主要产品有球阀、闸阀、截止阀、蝶阀、止回阀等三十多个品种,一千多个规格;品种类齐全,质量可靠。应用于钢铁、石油、化工、化肥、制药、电力、印染等行业。
        
回复:ajax jsp无刷新验证码实例
SEO翻译成中文就是"搜索引擎优化"。通过搜索引擎查找信息是当今网民们寻找网上信息和资源的主要手段。网站优化已经成为网络营销最重要的组成部分。如何使自己的网站被主要的搜索引擎收录、然后获得较高的SEO优化以及网站的google左侧排名,成为网站建设者们绞尽脑汁的话题。 目前以GOOGLESEO优化最为主流,GOOGLE左侧排名稳定性好,效果超强,同时带动了除GOOGLE以外的搜索引擎相互排名。
        
回复:ajax jsp无刷新验证码实例
Huadong pressure gauge Company is a professional Chinese pressure gauges supplier, exporter and manufacturer of many types of pressure gauges,regulators and thermomoters. We welcome OEM orders and we are willing to process according to ...
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号