`

AJAX+jsp无刷新验证码实例

阅读更多

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

1,img.jsp,输入主页面

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" pageEncoding="GBK"%>
<%
//set Chinese Char 
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());
}

  

 

分享到:
评论

相关推荐

    Ajax+jsp无刷新验证码实例

    Ajax+jsp无刷新验证码实例 包含 :Ajax+jsp无刷新验证码实例.docx img.jsp net.js num.jsp random.jsp

    基于JSP+JavaBean+Servlet+Ajax+Mysql的验证码 增删查改完整例子

    在IT领域,构建Web应用程序是常见的任务之一,而本示例提供了一个基于JSP、JavaBean、Servlet、Ajax以及Mysql的完整应用实例,主要涵盖了数据的增删查改(CRUD)操作,并且利用Ajax实现了异步的验证码验证功能。...

    SSH框架 Struts+Spring+Hibernate+Ajax+功能齐全(验证码+二进制文件图片读写数据库)的网站.zip

    4. **Ajax**:Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,与服务器交换数据并更新部分网页的技术。在这个项目中,Ajax可能被用来实现实时的验证码验证,用户无需提交整个表单就能验证...

    JavaMail+Ajax+Jsp实现邮箱发送验证消息并进行验证

    在这里,我们可以在JSP页面上编写处理Ajax请求的逻辑,比如验证验证码的有效性。 - **JSP标签库**: 使用JSTL (JavaServer Pages Standard Tag Library) 可以简化JSP页面的代码,例如使用 `&lt;c:if&gt;` 和 `&lt;c:choose&gt;` ...

    Ajax+Java开发实例源文件

    Ajax允许在不刷新整个页面的情况下与服务器进行异步通信,而Java则提供了后端处理逻辑和数据管理。** 在“Ajax+Java开发实例源文件”中,我们可以看到以下几个关键知识点: 1. **Ajax基础**:Ajax的核心是...

    jsp+ajax实现的局部刷新较验验证码(onblur事件触发较验)

    标题和描述中提到的“jsp+ajax实现的局部刷新较验验证码(onblur事件触发较验)”技术涉及的知识点主要包括了JSP页面技术、AJAX无刷新数据交互技术、以及验证码图片的生成和验证方法。下面将对这些知识点进行详细说明...

    jsp的彩色汉字验证码+刷新方法

    2. **AJAX刷新**:为了提供更好的用户体验,刷新验证码可能采用异步方式,即使用JavaScript的AJAX技术。点击按钮后,AJAX请求发送到服务器,服务器生成新的验证码并返回,然后前端更新图像源。 3. **会话管理**:...

    jquery实现无刷新验证码的简单实例

    在本实例中,将展示如何使用jQuery技术实现一个无刷新验证码功能。验证码的作用主要是为了防止恶意注册或登录,以及防止自动化工具进行的恶意操作。 ### 知识点一:验证码生成 在本实例中,验证码的生成是由服务器...

    JSP 制作验证码的实例详解

    同时,我们需要提供一种机制使用户能够刷新验证码,并通过Ajax发送用户输入的验证码到服务器进行验证。以下是一个简单的步骤概述: 1. **生成验证码图片**: - 使用`BufferedImage`类创建一个新的图像对象,定义其...

    各种验证码源码有仿googol等,有超过5个例子,可以参考

    无刷新验证码意味着在用户请求新验证码时,页面无需完全重新加载,提高了用户体验。开发者可以从中学习到如何利用ASP.NET控件和JavaScript/AJAX技术来实现这一功能。 4. **WebApplication6.rar**: 这可能是一个...

    JSP实例教程(电子商城)

    **JSP实例教程——电子商城开发详解** 在Web开发领域,JavaServer Pages(JSP)是一种广泛使用的服务器端脚本语言,它允许开发者创建动态、交互式的网页。本教程以"电子商城"为例,深入浅出地讲解了如何利用JSP进行...

    jsp页面验证码demo

    这里使用了AJAX技术实现前端页面的无刷新验证,提高了用户的交互体验。 验证码生成的详细过程在提供的代码片段中有更深入的介绍。这部分代码是在一个名为“VerifyCodeUtils”的类中实现的,它通过随机生成一些字符...

    jsp+Dreamweaver留言板系统

    这需要额外的管理界面,JSP页面会提供相应的操作接口,通过AJAX(Asynchronous JavaScript and XML)或刷新页面来更新显示。 5. **安全与防护**:为了防止SQL注入、XSS攻击等安全问题,系统需要对用户输入进行适当...

    JSP实战18例源代码

    14. **AJAX无刷新更新**:结合JavaScript和XMLHttpRequest实现页面部分内容的异步更新。 15. **验证码生成**:创建随机的图片验证码,防止恶意自动提交。 16. **邮件发送**:通过JavaMail API发送电子邮件。 17. ...

Global site tag (gtag.js) - Google Analytics