Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如:
验证码的字体
验证码字体的大小
验证码字体的字体颜色
验证码内容的范围(数字,字母,中文汉字!)
验证码图片的大小,边框,边框粗细,边框颜色
验证码的干扰线
验证码的样式(鱼眼样式、3D、普通模糊、…)
<!--验证码生成-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
/**
* 生成验证码配置
* //可以设置很多属性,具体看com.google.code.kaptcha.Constants
* 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
**/
@Controller
public class KaptchaConfig {
@Bean
public Producer kaptchaProducer() {
DefaultKaptcha captchaProducer = new DefaultKaptcha();
Properties properties = new Properties();
//字体颜色
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
//验证码宽 110px
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "110");
//验证码高 40px
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "40");
//字体大小
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "30");
//生成验证字符的长度
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
//字体
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑");
//验证码干扰项
properties.setProperty(Constants.KAPTCHA_NOISE_IMPL,"com.google.code.kaptcha.impl.NoNoise");
//验证字符选项 0-9及A-Z的组合 【可根据具体的情况,进行设置,汉字也同样可以作为验证符选项】
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING,"0123456789ABCDEFGHIGKLMNOPQRSTUVWSYZ");
Config config = new Config(properties);
captchaProducer.setConfig(config);
return captchaProducer;
}
}
生成图片验证码的关键接口为 com.google.code.kaptcha.Producer,其中关键的方法
String createText() //创建验证码字符串
BufferedImage createImage(String text);//根据所给的字符串生成验证码图像
package com.nowcoder.community.controller;
import com.google.code.kaptcha.Producer;
import com.nowcoder.community.entity.CommunityConstant;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.LoginService;
import com.nowcoder.community.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Map;
@Controller
public class LoginController {
@Autowired
private Producer producer;
/**
* 获得生成的随机验证码
* @param response
* @param httpSession
*/
@GetMapping("/login/getKapatchaImage")
public void getKapatchaImage(HttpServletResponse response, HttpSession httpSession){
//生成验证码
String text = producer.createText();
BufferedImage image = producer.createImage(text);
//验证码字符串写入到session中.服务器将依托cookie 【key,value】value中存放的是当前生成的sessionid.
//以后浏览器访问浏览器时,将会携带该cookie信息,使得多个浏览器请求中携带重要的信息【基于HTTP请求是无状态的,将验证字符串存入到session中,保存到服务中】
httpSession.setAttribute("kapatchaStr", text);
//图片响应给response
//响应格式为.png的图片
response.setContentType("image/png");
try {
ServletOutputStream outputStream = response.getOutputStream();
//响应给浏览器的是验证码图片
ImageIO.write(image,"png",outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}