第一中验证码:
一.验证码实现代码
通过BufferedImage类进行绘制:
package com.igeek.web;
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;
/**
* 验证码的Servlet
*/
@WebServlet("/verification.jpg")
public class VerificationCodeServlet extends HttpServlet {
//随机
private final Random rm = new Random();
/**
* 访问的时候 动态的创建一张图片
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int width = 100;
int height = 50;
//创建一个图片对象
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取绘图对象
Graphics g = image.getGraphics();
//绘制背景 绘制一个 填充的矩形
g.setColor(Color.WHITE); //设置画笔的颜色
g.fillRect(0, 0, width, height); //绘制填充的矩形
g.setColor(Color.RED);
g.drawRect(0, 0, width-2, height-2); //绘制矩形框
//绘制一些干扰 点
for(int i=0;i<100;i++) {
g.setColor(new Color(rm.nextInt(255),rm.nextInt(255),rm.nextInt(255)));
g.fillOval(rm.nextInt(width), rm.nextInt(height), 3, 3);
}
//绘制干扰线
for(int i=0;i<50;i++) {
g.setColor(new Color(rm.nextInt(255),rm.nextInt(255),rm.nextInt(255)));
g.drawLine(0, rm.nextInt(height), rm.nextInt(width), rm.nextInt(height));
}
g.setFont(new Font("黑体", Font.BOLD, 30)); //设置字体
//随机产生的验证码
String source = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456790";
String code = "";
for(int i=0;i<4;i++) {
String s = source.charAt(rm.nextInt(source.length()))+"";
//绘制文字
g.setColor(new Color(rm.nextInt(255),rm.nextInt(255),rm.nextInt(255)));
g.drawString(s, 10+i*23, 35);
code+= s;
}
System.out.println("code="+code);
//存入会话
request.getSession().setAttribute("Code", code);
//输出图片
ImageIO.write(image, "jpg", response.getOutputStream());
}
}
二.验证码校验
package com.igeek.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 校验验证码的Servlet
*/
@WebServlet("/check.do")
public class CheckVerificationCodeServlet extends HttpServlet {
/**
* 传递一个输入的值,验证和会话中存放的验证码是否一致
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String str_code = request.getParameter("str_code");
//得到会话
HttpSession session = request.getSession();
String code = (String)session.getAttribute("Code");
code = code==null?"":code;
response.getWriter().print(code.equals(str_code));
}
}
三.页面
<%@ page contentType="text/html;charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>页面标题</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
//校验输入框中输入的验证码是否正确
$(function(){
$("#varification").blur(function(){
//
$.get("check.do",{"str_code":$(this).val()},function(rs){
console.log(rs);
if(rs=='true'){
$("#sp").css({"color":"green"}).text("OK");
}else{
$("#sp").css({"color":"red"}).text("ERROR");
}
})
});
});
//点击换验证码图片 注意:每次更换图片的src值必须不同,这里拼接随机数 Math.random()
function changeImg(){
var vv = document.getElementById("varificationCode");
vv.src="verification.jpg?rm"+Math.random();
}
</script>
</head>
<body>
<input id="varification" placeholder="请输入验证码">
<a href="JavaScript:changeImg();">
<img alt="验证码" id="varificationCode" src="verification.jpg">
</a>
<a href="JavaScript:changeImg();">看不清楚,换一张?</a>
<br>
<span id="sp"></span>
</body>
</html>
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二中验证码:
代码
/**
* 获取验证码
*
* @param request a
* @param response a
* @return a
*/
public ModelAndView getValiYard(HttpServletRequest request,
HttpServletResponse response)
{
try
{
// 设置页面不缓存
BaseMultiController.initSet(request, response);
String valiyard = request.getParameter("valiyard");
HttpSession session = request.getSession(true);
// 在内存中创建图象
int width = 90;
int height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 随机产生50条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 50; i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(6位数字)
String sRand = "";
for (int i = 0; i < 6; i++)
{
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110))); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
// 将认证码存入SESSION
session.setAttribute(valiyard, sRand);
// 图象生效
g.dispose();
// 输出图象到页面
javax.servlet.ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "JPEG", out);
out.flush();
out.close();
}
catch (Exception e)
{
logger.writeLog(logger.LOG_LEVEL_ERROR,
logger.getExceptionMethodHint(), e);
}
return null;
}
/**
* 随机的颜色
* @param fc fc
* @param bc bc
* @return a
*/
private Color getRandColor(int fc, int bc)
{ // 给定范围获得随机颜色
Random random = new Random();
if (fc > 255)
{
fc = 255;
}
if (bc > 255)
{
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
页面:
<td style='padding-top: 5px;'>
<img id="checkCodeImg" name="checkCodeImg"
src="servlet/CheckCodeServlet?t=1312795073192"
onclick="javaScript:document.getElementById('checkCodeImg').src='servlet/CheckCodeServlet?t='+(new Date().getTime())" />
</td>