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. 6_16 单词(UVa10129)<欧拉回路>

    考古学家有时候遇到一些神秘的门,这些门需要解开特定的谜题才能打开.因为没有其他方法可以打开门,这谜题对我们来说非常重要.在门上有许多磁盘,每个盘子上有一个英文单字在上面.这些盘子必须被安排,使得盘子上 ...

  2. vue音乐播放器

    利用vue写一个简单的音乐播放器,包括功能有歌曲搜索.歌曲播放.歌曲封面.歌曲评论.播放动画.mv播放六个功能. <template> <div class="wrap&q ...

  3. 使用Docker搭建Spark集群(用于实现网站流量实时分析模块)

    上一篇使用Docker搭建了Hadoop的完全分布式:使用Docker搭建Hadoop集群(伪分布式与完全分布式),本次记录搭建spark集群,使用两者同时来实现之前一直未完成的项目:网站日志流量分析 ...

  4. Springmvc-crud-05(路径错误)

    错误: 原因:Tomcat8之后的一些高版本,使用restful风格访问然后转发到jsp页面,进行业务操作时会报路径错误  解决方案①:修改jsp页面中的page指令isErrorPage=" ...

  5. JAVA常量池、栈、堆的比较(转载)

    今天在学JAVA的数据存储位置的时候,看到了一篇博文感觉不错,特此转载: http://www.cnblogs.com/Eason-S/p/5658230.html JAVA中,有六个不同的地方可以存 ...

  6. Jmeter_选项_函数助手对话框_CSVRead

    1.之前有写过Jmeter_请求原件之参数化CSV 2.这次是使用函数助手 CSVRead去进行处理 3.作用注册10个账户 4.线程组设置,10个线程进行,因为是注册10个账户,如果线程设置为1,循 ...

  7. 洛谷 P5018 对称二叉树(搜索)

    嗯... 题目链接:https://www.luogu.org/problem/P5018 其实这道题直接搜索就可以搜满分: 首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点 ...

  8. [WC2018]即时战略(LCT,splay上二分)

    [UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...

  9. mysql成功的远程连接

    1.在虚拟机上的window7中安装mysql,版本mysql-5.7.27-win32,可以是解压版或者是安装版的, MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi ...

  10. mysql-8.0.18-winx64 环境变量的配置

    1. 鼠标右击   此电脑    -->属性 如图:进行步骤 1->2->3 接下来就可以使用命令mysql  -u  root  -p登录mysql了 启动mysql的命令为net ...