使用java实现验证码
1.创建一个servlet用于生成图片
<span style="font-size:12px;">package com.checkcode;
import java.awt.Color;
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.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CheckCode extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BufferedImage bi = new BufferedImage(70, 25, BufferedImage.TYPE_INT_RGB);
Graphics graphics = bi.getGraphics();
Color color = new Color(77, 255, 127); //设置背景颜色
graphics.fillRect(0, 0, 70, 25); //绘出背景
Random random = new Random();
StringBuffer sb = new StringBuffer();
int index;
char c[] = "abcdefghijklmnopqrstuvwxyz1234567890".toCharArray(); //随机可选字符
for(int i=0; i<4; i++){
index = random.nextInt(c.length); //随机产生字符
graphics.setColor(new Color(random.nextInt(255),random.nextInt(255) , random.nextInt(255))); //随机颜色
graphics.drawString(c[index]+"", i*15+3, 18); //绘出字符,设置位置
sb.append(c[index]); //保存验证码字符串
}
request.getSession().setAttribute("checkcode", sb.toString()); //设置session范围的验证码字符串
ImageIO.write(bi, "JPG", response.getOutputStream()); //输出图片
}
}</span>
2.在web.xml文件中添加servlet声明
<span style="font-size:12px;"> <servlet>
<description></description>
<display-name>CheckCode</display-name>
<servlet-name>CheckCode</servlet-name>
<servlet-class>com.checkcode.CheckCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckCode</servlet-name>
<url-pattern>/CheckCode</url-pattern> //虚拟访问路径
</servlet-mapping></span>
3.在页面中调用servlet
<span style="font-size:12px;"><%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>验证码</title>
<style type="text/css">
img{
width: 70px;
height: 25px
}
.class {
width: 100px;
height: 30px
}
</style>
<script type="text/javascript">
function reloadCode(){
var time = new Date().getTime();
document.getElementById("img1").src="<%=request.getContextPath()%>/CheckCode?d="+time;
}
</script>
</head>
<body>
<form action="..." method="GET">
<input type="text" name="checkCode">
</form>
<img id="img1" class="checkCode" alt="验证码" src="<%=request.getContextPath()%>/CheckCode">
<a href="javascript:reloadCode();">看不清楚</a>
</body>
</html></span>
使用kaptcha组件实现验证码
1、把下载的kaptcha-2.3.2.jar添加到lib中
2、配置web.xml增加servlet
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Kaptcha</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>
3、KaptchaServlet会把验证码设置到session中,可以如下方式获取
String kaptchaExpected = (String)request.getSession()
.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
4、如果想设置点击图片更换验证码,可以加上如下js,需要jquery
<script type="text/javascript">
$(function(){
$('#kaptchaImage').click(function () { $(this).attr('src', '/kaptcha.jpg?' + Math.floor(Math.random()*100) ); })
});
</script>
5、配置kaptcha
Constant | 描述 | 默认值 |
kaptcha.border | 图片边框,合法值:yes , no | yes |
kaptcha.border.color | 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. | black |
kaptcha.border.thickness | 边框厚度,合法值:>0 | 1 |
kaptcha.image.width | 图片宽 | 200 |
kaptcha.image.height | 图片高 | 50 |
kaptcha.producer.impl | 图片实现类 | com.google.code.kaptcha.impl.DefaultKaptcha |
kaptcha.textproducer.impl | 文本实现类 | com.google.code.kaptcha.text.impl.DefaultTextCreator |
kaptcha.textproducer.char.string | 文本集合,验证码值从此集合中获取 | abcde2345678gfynmnpwx |
kaptcha.textproducer.char.length | 验证码长度 | 5 |
kaptcha.textproducer.font.names | 字体 | Arial, Courier |
kaptcha.textproducer.font.size | 字体大小 | 40px. |
kaptcha.textproducer.font.color | 字体颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.textproducer.char.space | 文字间隔 | 2 |
kaptcha.noise.impl | 干扰实现类 | com.google.code.kaptcha.impl.DefaultNoise |
kaptcha.noise.color | 干扰颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.obscurificator.impl | 图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy | com.google.code.kaptcha.impl.WaterRipple |
kaptcha.background.impl | 背景实现类 | com.google.code.kaptcha.impl.DefaultBackground |
kaptcha.background.clear.from | 背景颜色渐变,开始颜色 | light grey |
kaptcha.background.clear.to | 背景颜色渐变,结束颜色 | white |
kaptcha.word.impl | 文字渲染器 | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
kaptcha.session.key | session key | KAPTCHA_SESSION_KEY |
kaptcha.session.date | session date | KAPTCHA_SESSION_DATE |
kaptcha可以配置一下信息:
验证码的字体
验证码字体的大小
验证码字体的字体颜色
验证码内容的范围(数字,字母,中文汉字!)
验证码图片的大小,边框,边框粗细,边框颜色
验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)
验证码的样式(鱼眼样式、3D、普通模糊……当然也可以继承com.google.code.kaptcha.GimpyEngine自定义样式)
……