show.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>验证码</title>
</head>
<script type="text/javascript">
function reLoadImg(){
document.getElementById("checkcodeId").innerHTML="";
document.getElementById("d1").innerHTML="";
document.getElementById("imageId").src="img.jsp?t="+(new Date().getTime());
}
function check(){
var ajax;
var inputCode=document.getElementById("checkcodeId").value;
//conlse.log(res);
if(window.XMLHttpRequest){//火狐
ajax= new XMLHttpRequest();
}else if(window.ActiveXObject){//ie
ajax=new ActiveXObject("Msxml2.XMLHTTP");
} //queryString=queryString+"param=" + new Date().getTime(); ajax.onreadystatechange = function () {
//判断ajax状态码
if(ajax.readyState==4){
//alert(5);
//判断响应状态码(200、405、404、500)
if(ajax.status==200){
//获取响应内容(相应内容的格式)
var res=ajax.responseText;
//console.log(res[0]+" "+res[1]);
eval("var obj="+res);
console.log(obj);
if(obj==true){//返回的字符串比较的时候不能带双引号
document.getElementById("d1").innerHTML="验证码正确";
}else if(obj==false){
document.getElementById("d1").innerHTML="验证码错误";
} } } }
ajax.open("get","check?inputCode="+inputCode);
ajax.send(null); }
</script> <body>验证码:
<input type="text" size="4" name="checkcode" id="checkcodeId">
<img src="img.jsp" id="imageId"/>
<a href="javascript:reLoadImg()">看不清</a>
<br>
<button onclick="check()">按钮</button>
<div id="d1"></div>
</body>
</html>

注意:后台返回的字符串在js中做判断时,字符串不用加双引号

img.jsp(画验证码)

这里的理论依据是:

网页链接:http://tool.oschina.net/commons/

之前我们的写的jsp都是当成一个html去展示的所以contentype=text/html;

现在如果我们需要将jsp当作产生验证码的图片格式那么contentype就必须要改变了

<%@page import="javax.imageio.ImageIO"%>
<%@page import="java.awt.Graphics"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.util.Random"%>
<%@page import="java.awt.Color"%>
<%@page import="java.awt.Font"%>
<%@ page language="java" contentType="image/jpeg; charset=utf-8"
pageEncoding="utf-8"%>
<%! //随机产生颜色 public Color getColor(){
int r=(int)(Math.random()*255);
int g=(int)(Math.random()*255);
int b=(int)(Math.random()*255); return new Color(r,g,b); //三个参数RGB
}
//产生验证码值
public String getnum(){
Random r = new Random();
String num=1000+r.nextInt(9000)+""; return num; } %> <%
//由于验证码必须是每次都不一样所以设置为禁止缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expirse", "0"); //绘制验证码 BufferedImage image=new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
//画笔
Graphics graphics= image.getGraphics();
graphics.fillRect(0, 0, 80, 30); //绘制干扰线条
for(int i=0;i<30;i++){
Random r=new Random();
int xBegin=r.nextInt(80);
int yBegin=r.nextInt(30); int xEnd=r.nextInt(xBegin+10);
int yEnd=r.nextInt(yBegin+10);
//设置画笔颜色随机
graphics.setColor(getColor()); //画线
graphics.drawLine(xBegin, yBegin,xEnd,yEnd); }
//验证码画笔为黑色
graphics.setColor(Color.BLACK);
String checkCode=getnum();
StringBuffer sb = new StringBuffer("");
for(int i=0;i<checkCode.length();i++){
sb.append(checkCode.charAt(i)+" "); } graphics.drawString(sb.toString(), 15, 20);
graphics.setFont(new Font("宋体",Font.BOLD,20));
//将正确验证码保存在session中方便比对
session.setAttribute("trueCheckCode",checkCode);
ImageIO.write(image, "jpeg", response.getOutputStream()); //关闭
out.clear();
out=pageContext.pushBody();
%>

处理的Servlet

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/check")
public class checkOut extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String input=req.getParameter("inputCode");
String res="false";
resp.setContentType("text/html; charset=utf-8");
String trueCode=(String) req.getSession().getAttribute("trueCheckCode");
if(input.equals(trueCode)){
res="true";
}
PrintWriter writer = resp.getWriter();
writer.write(res);
writer.close();
}
}

效果图:

点击看不进行验证码的刷新,注意并不是刷新整个页面,

1.有一个简单的刷新办法就是在看不清的href="show.jsp"但是这样是刷新了整个界面,很没有必要

2.有一个办法就是在点击看不清时让它不进行跳转而是执行js中的一个函数(我也是这么做的)

这一句让它执行js中reLoadImg()函数

<a href="javascript:reLoadImg()">看不清</a>

注意在改变动态图片的src时,后面必须加一个随机数,否则它会认为请求已经处理过了,所以这次请求无效(现象:不会刷新验证码)。

function reLoadImg(){
document.getElementById("checkcodeId").innerHTML="";
document.getElementById("d1").innerHTML="";
document.getElementById("imageId").src="img.jsp?t="+(new Date().getTime());
}

格式2:

show.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>验证码</title>
</head>
<script type="text/javascript">
function reLoadImg(){
document.getElementById("i2").style.display="none";
document.getElementById("checkcodeId").innerHTML="";
document.getElementById("d1").innerHTML="";
document.getElementById("imageId").src="img.jsp?t="+(new Date().getTime());
}
function check(){
var ajax;
var inputCode=document.getElementById("checkcodeId").value;
//conlse.log(res);
if(window.XMLHttpRequest){//火狐
ajax= new XMLHttpRequest();
}else if(window.ActiveXObject){//ie
ajax=new ActiveXObject("Msxml2.XMLHTTP");
} //queryString=queryString+"param=" + new Date().getTime(); ajax.onreadystatechange = function () {
//判断ajax状态码
if(ajax.readyState==4){
//alert(5);
//判断响应状态码(200、405、404、500)
if(ajax.status==200){
//获取响应内容(相应内容的格式)
var res=ajax.responseText;
//console.log(res[0]+" "+res[1]);
//alert(11);
//eval("var obj="+res);
//console.log(res);
document.getElementById("i2").src=res;
document.getElementById("i2").style.display="inline";
document.getElementById("i2").style.width=40+"px";
document.getElementById("i2").style.height=40+"px";
} } }
ajax.open("get","check?inputCode="+inputCode);
ajax.send(null); }
</script> <body>验证码:
<input type="text" size="4" name="checkcode" id="checkcodeId" onmouseout="check()">
<img src="img.jsp" id="imageId"/>
<a href="javascript:reLoadImg()">看不清</a>
<img src="" id="i2"> </body>
</html>

img.jsp没变

Servlet

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/check")
public class checkOut extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String input=req.getParameter("inputCode");
String res="img/judge1.jpg";
resp.setContentType("text/html; charset=utf-8");
String trueCode=(String) req.getSession().getAttribute("trueCheckCode");
if(input.equals(trueCode)){
res="img/judge2.jpg";
}
PrintWriter writer = resp.getWriter();
writer.write(res);
writer.close();
}
}

效果:输入验证码后当鼠标移出输入文本框(触发mouseout事件)后台返回图片地址图片是一个对勾和一个叉

点击看不清,判断图片消失

点击看不清后:

验证码校验(Ajax)的更多相关文章

  1. Django 博客项目01 数据库设计与验证码校验+Ajax登录

    数据库设计 from django.db import models from django.contrib.auth.models import AbstractUser class UserInf ...

  2. AJAX应用【股票案例、验证码校验】

    一.股票案例 我们要做的是股票的案例,它能够无刷新地更新股票的数据.当鼠标移动到具体的股票中,它会显示具体的信息. 我们首先来看一下要做出来的效果: 1.1服务器端分析 首先,从效果图我们可以看见很多 ...

  3. 简单的jQuery前端验证码校验

    简单的jQuery前端验证码校验2 html; <!DOCTYPE html> <html lang="zh-cn"> <head> <m ...

  4. springboot集成shiro实现验证码校验

    github:https://github.com/peterowang/shiro/ 这里实现验证码校验的思路是自己添加一个Filter继承FormAuthenticationFilter,Form ...

  5. jquery验证后ajax提交,返回消息怎样统一显示的问题

    /* jquery验证后ajax提交.返回消息怎样跟jquery验证体系统一显示的问题,网上查了非常多资料.都没有找到明白的答案,通过数小时的尝试,最终攻克了,现举一个简单的样例,给须要的人參考參考吧 ...

  6. Form表单利用Jquery Validate验证以及ajax提交

    #表单利用Jquery验证验证以及ajax提交 概述>详细讲解表单利用Jquery >验证验证以及ajax提交的过程,以及Validate的自定义提示语,非空判断,输入字段的远程ajax验 ...

  7. SpringBoot整合Shiro完成验证码校验

    SpringBoot整合Shiro完成验证码校验 上一篇:SpringBoot整合Shiro使用Redis作为缓存 首先编写生成验证码的工具类 package club.qy.datao.utils; ...

  8. JSP页面实现验证码校验

    目录 验证码校验分析 生成验证码 测试验证码 校验验证码 测试验证码校验 添加验证码刷新 在网页页面的使用中为防止"非人类"的大量操作和防止一些的信息冗余,增加验证码校验是许多网站 ...

  9. 利用Hutool-(Java工具类)实现验证码校验

    目录 Hutool工具类介绍 Hutool实现验证码生成 测试验证码生成 其他样式的验证码 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. ...

随机推荐

  1. TCP的状态转换

    TCP的状态转换图 手写的状态转换图 一.服务端状态变迁:​ 服务端创建套接字之后调用listen函数将套接字有一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态 ...

  2. 密码学笔记——playfair密码

     Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明. 例题: 某种 ...

  3. lamp与zabbix开机自启

    目录 1.控制httpd脚本 2.控制zabbix_server脚本 3.控制zabbix_agentd脚本 4.服务端lamp开机自动启动 5.客户端zabbix_agentd开机自动启动 1.控制 ...

  4. 多表更新:update,join

    1.多表更新: 下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法. 前期准备工作: update join_teacher_class jo ...

  5. JDK动态代理+反射实现动态修改注解属性值

    这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~ 一.准备自定义注解 注:如何实现自定义注解,请移步百度. 二.实现 1.实现方式1:通过反射+动态代理动态 ...

  6. Spring Boot高频面试题:Spring Boot执行原理

    之前一篇文章Spring Boot快速入门文章中,我们已经体会到Spring Boot的神器,不再像之前Spring那样需要繁琐的XML,甚至几秒钟就能搭建出Spring的项目骨架.接下来我们简单分析 ...

  7. mysql客户端的导出数据库表和数据库数据等相关操作

    1.navicat for mysql 11.0.10客户端 导出数据库里所有表中的所有数据,方法如下,选中表,在横向导航栏里面找到“导出向导”,选中sql,点击下一步,点击全选,并且选中“应用相同目 ...

  8. C语言随笔2: rom ram 及其运行的过程

    内存的分配方式 五个区 :堆区.栈区.全局区.文字常量区.程序代码区 这五个区是ram中的.或者说,堆栈段.数据段.代码段 而rom中,没有堆区和栈区,只有数据段和代码段. ram是在程序运行是的内存 ...

  9. 如何让后加载的元素被一开始就有的css样式渲染成功(强制提升css优先级)

    今天在做搜索框中的提示语下拉的时候,提示框把搜索框的底部的border遮住,导致看起来不是很美观: 因为下方的提示框是用js后加载的它的样式也是随着js一起加载的,而这个js和它的css我们是不能改动 ...

  10. cmake使用的一些补充

    一般使用cmake生成vs项目的时候,要么生成32位的要么生成64位的. 怎样将32位和64位在一个工程中打开呢,联系我们自己建立的工程都是32位和64位在一起的,就动手开始了. 实验对象是openc ...