使用kaptcha开源组件或java实现验证码

本文介绍如何使用Java创建自定义验证码图片,并通过Kaptcha组件生成复杂验证码。涵盖Servlet生成图片、配置web.xml及页面调用流程,同时提供Kaptcha配置详解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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 , noyes
kaptcha.border.color边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.black
kaptcha.border.thickness边框厚度,合法值:>01
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.keysession keyKAPTCHA_SESSION_KEY
kaptcha.session.datesession dateKAPTCHA_SESSION_DATE

kaptcha可以配置一下信息:

验证码的字体

验证码字体的大小

验证码字体的字体颜色

验证码内容的范围(数字,字母,中文汉字!)

验证码图片的大小,边框,边框粗细,边框颜色

验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)

验证码的样式(鱼眼样式、3D、普通模糊……当然也可以继承com.google.code.kaptcha.GimpyEngine自定义样式)

……


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值