<!-- 一.用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>Insert title here</title>
<script type="text/javascript" src="js/myajax.js"></script>
<style>
#vcode{
width:100px;
height:38px;
float:left;
}
#vcodeImg{
border:1px solid rgba(0,0,0,0.2);
cursor:pointer;
}
</style>
</head>
<body>
<input type="text" name="vcode" id="vcode" placeholder="验证码">
<img alt="验证码" src="ValidateCode" id="vcodeImg" title="看不清,换一张">
<button onclick="checkCode()">验证</button>
<script>
function checkCode(){
//异步刷新
ajaxGet('ValidateServlet?vcode='+$('vcode').value,function(data){
if(data == 1){
alert('验证通过');
//验证通过之后刷新验证码
$('vcodeImg').src='ValidateCode?'+Math.random();
}else{
alert('验证失败');
}
});
}
$('vcodeImg').addEventListener('click',function(){
//设置图片的src,为了防止页面缓存,每次向后台传递一个随机数
this.src='ValidateCode?r='+Math.random();
});
function $(id)
{
return document.getElementById(id);
}
</script>
</body>
</html>
/*
* 二.封装一个用于发送get请求的ajax函数
*/
//参数1:需要请求的服务器地址
//参数2:需要执行的回调函数
function ajaxGet(url,callback){
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('microsoft.XMLHTTP');
}
//打开连接
xhr.open('get',url,true);
//发送请求
xhr.send();
//当请求状态发生改变时触发回调函数
xhr.onreadystatechange=function(){
if(xhr.readyState == 4 && xhr.status == 200){
var data = xhr.responseText;
//data = JSON.parse(data);
//闭包
callback(data);
}
}
}
/*
* 三.1.用servlet写验证码的生成过程
*/
package com.softeem.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
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("/ValidateCode")
public class ValidateCode extends HttpServlet {
private static final long serialVersionUID = 1L;
//生成验证码的基本字符序列
private static final String CODES = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//初始化验证码的宽度与高度
private static final int WIDTH = 100;
private static final int HEIGHT = 40;
//初始化验证码字符数
private static final int CODE_COUNT = 4;
//初始化噪点比例
private static final double POINTS = 0.05;
//干扰线的条数
private static final int LINE_COUNT = 10;
private Random random = new Random();
public ValidateCode() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
//完成验证码的生成过程
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.生成验证码的字符
//2.生成图片
BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = img.getGraphics();
//填充可绘制区域
g.fillRect(0, 0, WIDTH, HEIGHT);
//创建字体
Font font = new Font("黑体", Font.BOLD, 25);
//设置字体
g.setFont(font);
//声明缓冲字符串对象,存储生成的验证码
StringBuffer buff = new StringBuffer();
for (int i = 0; i < CODE_COUNT; i++) {
//设置画笔颜色
g.setColor(genColor());
//生成一个字符
char c = genCode();
//绘制字符到图像中
g.drawString(c+"", i*20+5, 25);
//拼接到字符串中
buff.append(c);
}
//添加噪点
int area = (int)(WIDTH * HEIGHT * POINTS);
for (int i = 0; i < area; i++) {
g.setColor(genColor());
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
img.setRGB(x, y, genColor().getRGB());
}
//添加干扰线
for (int i = 0; i < LINE_COUNT; i++) {
//随机设置画笔颜色
g.setColor(genColor());
//随机线段起始,结束位置
int xstart = random.nextInt(WIDTH);
int ystart = random.nextInt(HEIGHT);
int xend = random.nextInt(WIDTH);
int yend = random.nextInt(HEIGHT);
//绘制线段
g.drawLine(xstart, ystart, xend, yend);
}
//验证码缓存到session中
request.getSession().setAttribute("realCode", buff.toString());
System.out.println("验证码:"+buff.toString());
//3.通过输出流输出
//设置响应数据的类型
response.setContentType("image/jpeg");//MIME-Type
//清除缓存(禁止浏览器缓存)
response.setHeader("pregam", "No-cache");
response.setHeader("cache-control", "No-cache");
response.setDateHeader("expire", 0);
//向页面端输出
ImageIO.write(img, "JPG", response.getOutputStream());
}
//随机生成颜色
private Color genColor(){
return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
}
//随机生成一个字符
private char genCode(){
return CODES.charAt(random.nextInt(CODES.length()));
}
}
/*
* 三.2.servlet验证验证码
*/
package com.softeem.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("/ValidateServlet")
public class ValidateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ValidateServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取提交过来的验证码
String vcode = request.getParameter("vcode");
//取出session中的验证码
String realCode = request.getSession().getAttribute("realCode").toString();
//获取基于response的输出流
PrintWriter out = response.getWriter();
//忽略大小写比较
if(vcode.equalsIgnoreCase(realCode)){
//验证通过
out.print(1);
}else{
//验证失败
out.println(-1);
}
out.flush();
}
}