SpringMvc使用GoogleKaptcha生成验证码

发布时间 - 2026-01-11 03:26:30    点击率:

前言:google captcha 是google生成验证码的一个工具类,其原理是将随机生成字符串保存到session中,同时以图片的形式返回给页面,之后前台页面提交到后台进行对比。

1、jar包准备

官方提供的pom应该是

<dependency> 
  <groupId>com.google.code.kaptcha</groupId> 
  <artifactId>kaptcha</artifactId> 
  <version>2.3.2</version> 
</dependency>

但是下载不下来,我在阿里的maven仓库找到的pom如下:

<dependency> 
  <groupId>com.github.penggle</groupId> 
  <artifactId>kaptcha</artifactId> 
  <version>2.3.2</version> 
</dependency>

测试可以正常下载,这里推荐阿里的maven仓库,下载速度还行,挺稳定,附地址:http://maven.aliyun.com/nexus/#welcome

2、spring bean的配置

<!-- google kaptcha的相关配置-->
  <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha"> 
    <property name="config"> 
      <bean class="com.google.code.kaptcha.util.Config"> 
        <constructor-arg> 
          <props> 
            <!-- 是否有边框 可选yes 或者 no --> 
            <prop key="kaptcha.border">yes</prop> 
            <!-- 边框颜色 -->
            <prop key="kaptcha.border.color">105,179,90</prop> 
            <!-- 验证码文本字符颜色 -->
            <prop key="kaptcha.textproducer.font.color">blue</prop> 
            <!-- 验证码文本字符大小 -->
            <prop key="kaptcha.textproducer.font.size">45</prop> 
            <!-- 验证码图片的宽度 默认200 -->
            <prop key="kaptcha.image.width">125</prop> 
            <!-- 验证码图片的高度 默认50 -->
            <prop key="kaptcha.image.height">45</prop> 
            <!-- 验证码文本字符长度 默认为5 -->
            <prop key="kaptcha.textproducer.char.length">4</prop> 
            <!-- 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) -->
            <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop> 
          </props> 
        </constructor-arg> 
      </bean> 
    </property> 
  </bean>

3、Controller的两个方法

package com.ccg.controller;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;

@Controller
@RequestMapping("captcha")
public class CaptchaController {

  @Resource
  private Producer captchaProducer;
  /**
   *       
   *        获取验证码图片
   * @author     ccg
   * @param     request
   * @param     response
   * @return
   * @throws     IOException
   * Created    2017年1月17日 下午5:07:28
   */
  @RequestMapping("getCaptchaCode")
  public ModelAndView getCaptchaCode(HttpServletRequest request, HttpServletResponse response) throws IOException{
    HttpSession session = request.getSession();
    
    response.setDateHeader("Expires", 0); 
    response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
    response.addHeader("Cache-Control", "post-check=0, pre-check=0"); 
    response.setHeader("Pragma", "no-cache"); 
    response.setContentType("image/jpeg"); 
    
    //生成验证码文本
    String capText = captchaProducer.createText(); 
    session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
    System.out.println("生成验证码文本===="+capText);
    //利用生成的字符串构建图片
    BufferedImage bi = captchaProducer.createImage(capText);
    ServletOutputStream out = response.getOutputStream(); 
    ImageIO.write(bi, "jpg", out); 
    
    try { 
      out.flush(); 
    } finally { 
      out.close(); 
    }
    return null;
  }
  
  /**
   *       
   *        前端输入的验证码与生成的对比
   * @author     ccg
   * @param     request
   * @param     response
   * @param     captchaCode
   * Created    2017年1月17日 下午5:34:23
   */
  @RequestMapping("checkCaptchaCode")
  public void checkCaptchaCode(HttpServletRequest request, HttpServletResponse response,@RequestParam("captchaCode") String captchaCode){
    System.out.println("页面输入验证码===="+captchaCode);
    
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    
    String generateCode =(String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
    String result = "";
    if(generateCode.equals(captchaCode)){
      result = "验证成功";
    }else{
      result = "输入错误";
    }
    PrintWriter out = null;
    try {
      out = response.getWriter();
    } catch (IOException e) {
      e.printStackTrace();
    }
    out.print(result);
    out.flush();
  }
}

4、前台页面代码

<%@ 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>
<script src="${pageContext.request.contextPath}/js/jquery.min.js" type="text/javascript"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  生成的验证码:<img id="changeCaptcha" src="http://127.0.0.1/captcha/getCaptchaCode.htm"> <a href="javascript:changeCaptcha()" rel="external nofollow" >看不清,换一张</a>
  <br>
  <br>
  请输入验证码:<input id="captchaCode" type="text"> <input type="button" value="提交验证" onclick="checkCaptcha()">
</body>
<script type="text/javascript">
//获取验证码图片 
function changeCaptcha(){
  $("#changeCaptcha").attr("src","http://127.0.0.1/captcha/getCaptchaCode.htm");
}
//验证输入的验证码 
function checkCaptcha(){
  var captchaCode = $("#captchaCode").val();
  $.ajax({
    type:'post',
    async : false,
    url:'http://127.0.0.1/captcha/checkCaptchaCode.htm',
    data:{"captchaCode" : captchaCode},
    success:function(res){
      alert(res);
    }
  });
}
</script>
</html>

需要注意到引用了jquery.min.js

5、运行效果

附Google Captcha 可配置项

kaptcha.border  是否有边框  默认为true  我们可以自己设置yes,no 
kaptcha.border.color   边框颜色   默认为Color.BLACK 
kaptcha.border.thickness  边框粗细度  默认为1 
kaptcha.producer.impl   验证码生成器  默认为DefaultKaptcha 
kaptcha.textproducer.impl   验证码文本生成器  默认为DefaultTextCreator 
kaptcha.textproducer.char.string   验证码文本字符内容范围  默认为abcde2345678gfynmnpwx 
kaptcha.textproducer.char.length   验证码文本字符长度  默认为5 
kaptcha.textproducer.font.names    验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) 
kaptcha.textproducer.font.size   验证码文本字符大小  默认为40 
kaptcha.textproducer.font.color  验证码文本字符颜色  默认为Color.BLACK 
kaptcha.textproducer.char.space  验证码文本字符间距  默认为2 
kaptcha.noise.impl    验证码噪点生成对象  默认为DefaultNoise 
kaptcha.noise.color   验证码噪点颜色   默认为Color.BLACK 
kaptcha.obscurificator.impl   验证码样式引擎  默认为WaterRipple 
kaptcha.word.impl   验证码文本字符渲染   默认为DefaultWordRenderer 
kaptcha.background.impl   验证码背景生成器   默认为DefaultBackground 
kaptcha.background.clear.from   验证码背景颜色渐进   默认为Color.LIGHT_GRAY 
kaptcha.background.clear.to   验证码背景颜色渐进   默认为Color.WHITE 
kaptcha.image.width   验证码图片宽度  默认为200 
kaptcha.image.height  验证码图片高度  默认为50

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# SpringMvc  # GoogleKaptcha  # 验证码  # Go生成base64图片验证码实例(超详细工具类)  # Google Kaptcha验证码生成的使用实例说明  # golang包快速生成base64验证码的方法  # 使用google.kaptcha来生成图片验证码的实现方法  # Django 生成登陆验证码代码分享  # Django验证码的生成与使用示例  # Go语言简易图像验证码生成的实战案例  # 默认为  # 噪点  # 下午  # 我在  # 我们可以  # 微软  # 下载速度  # 注意到  # 请输入  # 可选  # 还行  # 大家多多  # 宋体  # 应该是  # ImageIO  # servlet  # HttpServletRequest  # stereotype 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: bing浏览器学术搜索入口_bing学术文献检索地址  如何用低价快速搭建高质量网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  C语言设计一个闪闪的圣诞树  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Laravel安装步骤详细教程_Laravel环境搭建指南  如何快速搭建二级域名独立网站?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  太平洋网站制作公司,网络用语太平洋是什么意思?  如何在阿里云ECS服务器部署织梦CMS网站?  Android利用动画实现背景逐渐变暗  大型企业网站制作流程,做网站需要注册公司吗?  Laravel如何使用查询构建器?(Query Builder高级用法)  原生JS实现图片轮播切换效果  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  香港服务器选型指南:免备案配置与高效建站方案解析  iOS UIView常见属性方法小结  如何自定义建站之星模板颜色并下载新样式?  Bootstrap整体框架之CSS12栅格系统  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  WEB开发之注册页面验证码倒计时代码的实现  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何在阿里云高效完成企业建站全流程?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  高端企业智能建站程序:SEO优化与响应式模板定制开发  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  北京网站制作的公司有哪些,北京白云观官方网站?  JavaScript如何实现路由_前端路由原理是什么  Windows Hello人脸识别突然无法使用  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel Fortify是什么,和Jetstream有什么关系  浅谈Javascript中的Label语句  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  javascript中闭包概念与用法深入理解  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  如何在万网自助建站平台快速创建网站?  EditPlus中的正则表达式实战(6)  Laravel如何使用Livewire构建动态组件?(入门代码)  如何用景安虚拟主机手机版绑定域名建站?  如何基于云服务器快速搭建个人网站?  黑客入侵网站服务器的常见手法有哪些?