- 随机生成字符最后返回值是图片字节流(方法的调用)
@GetMapping("get-verify-pic")
public void getVerifyPic(final HttpServletRequest request, final HttpServletResponse response){
try {
String bfCode = BfCodeUtil.getBfCode(codeRepository.getCurrentCode(BaseConstantValue.BFCODE));
//设置相应类型,告诉浏览器输出的内容为图片
response.setContentType("image/jpeg");
//设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("bfCode", bfCode);
response.setDateHeader("Expire", 0);
final RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
//输出验证码图片方法
randomValidateCode.getRandcode(request, response);
//把图片验证码的值存到redis中
final String verifyCode = randomValidateCode.getRandomString();
redisTemplate.opsForValue().set(RedisUtils.REDIS_TABLE_ENTERPRISE_VERIFY_CODE + bfCode, verifyCode, 30, TimeUnit.MINUTES);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
- 随机生成字符的工具类
public class RandomValidateCodeUtil {
// public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key
//随机产生只有数字的字符串 private String
private String randString = "0123456789abcdefghijklmnopqrstuvwxyz";
//private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
//private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
//图片宽
private int width = 95;
//图片高
private int height = 25;
//干扰线数量
private int lineSize = 40;
//随机产生字符数量
private int stringNum = 4;
// 绘制随机字符
private String randomString = "";
private Random random = new Random();
public RandomValidateCodeUtil() {
}
/**
* 获得字体.
* @author default
* @date 17:47 2019/10/10
* @Param
* @return java.awt.Font
*/
private Font getFont() {
return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
}
/**
* 获得颜色.
* @author default
* @date 17:47 2019/10/10
* @param fc fc
* @param bc bc
* @return java.awt.Color
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
final int r = fc + random.nextInt(bc - fc - 16);
final int g = fc + random.nextInt(bc - fc - 14);
final int b = fc + random.nextInt(bc - fc - 18);
return new Color(r, g, b);
}
/**
* 生成随机图片.
* @author default
* @date 17:49 2019/10/10
* @param request request
* @param response response
*/
public void getRandcode(final HttpServletRequest request, final HttpServletResponse response) {
// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
final Graphics g = image.getGraphics();
//图片大小
g.fillRect(0, 0, width, height);
//字体大小
g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
//字体颜色
g.setColor(getRandColor(110, 133));
// 绘制干扰线
for (int i = 0; i <= lineSize; i++) {
drowLine(g);
}
for (int i = 1; i <= stringNum; i++) {
randomString = drowString(g, randomString, i);
}
g.dispose();
try {
// 将内存中的图片通过流动形式输出到客户端
ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (Exception e) {
}
}
/**
* 绘制字符串.
* @author default
* @date 17:51 2019/10/10
* @param g g
* @param randomString randomString
* @param i i
* @return java.lang.String
*/
private String drowString(final Graphics g, String randomString, final int i) {
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
.nextInt(121)));
final String rand = String.valueOf(getRandomString(random.nextInt(randString
.length())));
randomString += rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 16);
return randomString;
}
/**
* 绘制干扰线.
* @author default
* @date 17:52 2019/10/10
* @param g g
*/
private void drowLine(final Graphics g) {
final int x = random.nextInt(width);
final int y = random.nextInt(height);
final int xl = random.nextInt(13);
final int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
}
/**
* 获取随机的字符.
* @author default
* @date 17:52 2019/10/10
* @param num num
* @return java.lang.String
*/
public String getRandomString(final int num) {
return String.valueOf(randString.charAt(num));
}
/**
* description.
* @author default
* @date 17:53 2019/10/10
* @Param
* @return java.lang.String
*/
public String getRandomString() {
return randomString;
}
}
- redis工具类
public class RedisUtils {
/***
* 工商资质-图片验证码
*/
public static String REDIS_TABLE_ENTERPRISE_VERIFY_CODE = "enterprise_verify_code:";
/**
* @Author:Evan Yang
* @Description: 获取指定库 的redisTemplate实例
* @Date: 2018/7/31
* @Modificd By:
* @Param: dataBaseNo redis库编号
* @return:
* @throw: 请描述异常信息
*/
public static RedisTemplate setDataBase(RedisTemplate redisTemplate, Integer dataBaseNo){
//设置使用的库的编码
JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
// jedisConnectionFactory.setDatabase(dataBaseNo);
jedisConnectionFactory.setDatabase(0);
redisTemplate.setConnectionFactory(jedisConnectionFactory);
//设置编码防止出现乱码
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
/**
* @Description: 设置redis序列化
* @Author: evan
*/
public static RedisTemplate setSerializer(RedisTemplate redisTemplate){
//设置编码防止出现乱码
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
- 进行验证码验证
@GetMapping("/verify-code")
public ResultModel verifyCode(@RequestParam("bfCode")String bfCode, @RequestParam("verifyCode")String verifyCode) throws Exception {
ResultModel resultModel = new ResultModel();
if (StrUtils.isEmpty(verifyCode)){
resultModel.setCode("10001");
resultModel.setMsg("请输入图片验证码");
return resultModel;
}
//校验图片验证码是否正确
String verifyCodeRedis = (String) redisTemplate.opsForValue().get(RedisUtils.REDIS_TABLE_ENTERPRISE_VERIFY_CODE + bfCode);
if (StrUtils.isEmpty(verifyCodeRedis)){
redisTemplate.delete(RedisUtils.REDIS_TABLE_ENTERPRISE_VERIFY_CODE + bfCode);
resultModel.setCode("10001");
resultModel.setMsg("图片验证码已失效 请刷新重试");
return resultModel;
}
if (!verifyCodeRedis.equals(verifyCode)){
redisTemplate.delete(RedisUtils.REDIS_TABLE_ENTERPRISE_VERIFY_CODE + bfCode);
resultModel.setCode("10001");
resultModel.setMsg("验证码不正确,请重新获取");
return resultModel;
}
resultModel.setCode("10000");
resultModel.setMsg("验证码正确");
return resultModel;
}