用servlet在网页生成验证码并验证

<!-- 一.用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();
	}

}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值