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. Java连载64-finally语法及其注意事项

    一.finally语句块 1.注意点: (1)finally语句块可以直接和try语句块联合使用.try...finally.... (2)try.....catch.....finally也可以执行 ...

  2. docker 初识1

    学习网址 https://git.oschina.net/yangllsdev/docker-training https://docs.docker.com/engine/installation/ ...

  3. Windows Server 2012 忘记登录密码怎么办?

    Windows Server 2012系统 忘记登录密码处理方法,此方法在其他 Server 系统应该是通用的(其他系统未做测试,请知悉) 电脑 Windows Server 2012系统 做好的U盘 ...

  4. 主席树 hdu 4417

    求一个区间内小于等于limit的数: 主席树模板题. 求出每一个节点的sum: #include<cstdio> #include<algorithm> #include< ...

  5. jquery 相同ID 绑定事件

    本文链接:https://blog.csdn.net/lan_13217/article/details/84079441 http://hi.baidu.com/meneye/blog/item/1 ...

  6. laravel Excel导入导出

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. 该 ...

  7. VS2017出现不存在从"CString"到"const char*"的适当转换函数

    出现不存在从CStrign到const char*的转换,可以将项目属性的字符集设置从"使用Unicode字符集“转换为”使用多字字符集“. 点击”项目“----“属性”----“配置属性” ...

  8. Dart语言学习(八) dynamic

    dynamic 表示是动态的,数据类型是指任意类型 var a; a = ; a = "Dart"; print(a); dynamic b = ; b = "JavaS ...

  9. Java开发中模拟接口工具moco的使用

    场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...

  10. Web基础了解版07-EL表达式-运算符-11个隐式对象

    EL EL(Expression Language)是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进 ...