最近项目用到登录验证码,简单总结一下我们的处理方式。
随机的图片是放在文件服务器 ,这里用的是fastdsf 存库
批量生产验证码
ValidateCode code = new ValidateCode();
for (int i = 0; i < 200; i++) {
random = userValidateImageService.getRandomImageAndUrl();
arg = random.split(";");
code.setValidateCode(arg[0]);
code.setValidateImage(arg[1]);
validateCodeMapper.insertSelective(code);
}
---------------------------------------------------
package com.zfs.service.user.impl;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.zfs.service.fastdfs.FileClientService;
import com.zfs.service.user.IUserValidateImageService;
import com.zfs.tool.ConfigTool;
import com.zfs.tool.RandomValidateCode;
@Service
public class UserValidateImageSerivceImpl implements IUserValidateImageService {
@Resource
private FileClientService fileClientService;
private static final Logger logger = (Logger) LoggerFactory
.getLogger(UserValidateImageSerivceImpl.class);
public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
private Random random = new Random();
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
private int width = 80;//图片宽
private int height = 26;//图片高
private int lineSize = 40;//干扰线数量
private int stringNum = 4;//随机产生字符数量
/*
* 获得字体
*/
private Font getFont(){
return new Font("Fixedsys",Font.CENTER_BASELINE,18);
}
/*
* 获得颜色
*/
private Color getRandColor(int fc,int bc){
if(fc > 255)
fc = 255;
if(bc > 255)
bc = 255;
int r = fc + random.nextInt(bc-fc-16);
int g = fc + random.nextInt(bc-fc-14);
int b = fc + random.nextInt(bc-fc-18);
return new Color(r,g,b);
}
/**
* 生成随机图片
*/
@Override
public String getRandomImageAndUrl() {
//BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
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);
}
//绘制随机字符
String randomString = "";
String randImg = "";
for(int i=1;i<=stringNum;i++){
randomString=drowString(g,randomString,i);
}
logger.info("----------------------------------------->验证码"+randomString);
String fileName = randomString + ".jpg";
String path = ConfigTool.getConfigValue("tempPath") + "/" + fileName;
File file = new File(path);
g.dispose();
try {
ImageIO.write(image, "JPEG", file);
randImg = fileClientService.uploadFile(file);
// FileClientServiceImpl
// ImageIO.write(image, "JPEG", file);//将内存中的图片通过流动形式输出到客户端
// HttpServletResponse
// ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
randomString =randomString+";"+randImg;
return randomString;
}
//FileClientServiceImpl fileClientServiceImpl = new FileClientServiceImpl();
/*
* 绘制字符串
*/
private String drowString(Graphics g,String randomString,int i){
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
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;
}
/*
* 绘制干扰线
*/
private void drowLine(Graphics g){
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x+xl, y+yl);
}
/*
* 获取随机的字符
*/
public String getRandomString(int num){
return String.valueOf(randString.charAt(num));
}
public static void main(String[] args) {
RandomValidateCode randomValidateCode = new RandomValidateCode();
for (int i = 0; i < 200; i++) {
String randomString = randomValidateCode.getRandcode();
}
}
}
-------------------------------------------------------------
页面显示取得二维码
首页登录是 随机random 200之内的数。
user.getRandomSeries = function(range) {
var str = Math.floor((Math.random()) * (range));
if(str==0){
str =Math.floor((Math.random()) * (range));
}
return str;
}
.加入cookies
base.addCookie("C_I_C",timestamp,{path:"/",expires: 7});
$.ajax({
type:"post",
data:par,
dataType:'text',
url:cms.url.admin.randomValidate,
success: function(data){
$(obj).prev().attr("src",data);
}
});
后台取。
@Override
public String getValidateCode(HttpServletResponse response, Integer randCode) {
ValidateCode validateCode = new ValidateCode();
String result = "";
String validateImgPath = "";
validateCode = this.validateCodeMapper.selectByPrimaryKey(randCode);
validateImgPath = ConfigTool.getConfigValue("FilePath");
result = validateImgPath + validateCode.getValidateImage();
return result;
}
/后端验证输入的验证码 与 页面的验证码 匹配 规则
"mycode":base.getCookie("C_I_C")
ValidateCode validateCode = this.validateCodeMapper.selectByPrimaryKey(myCode);
if (userCode.equalsIgnoreCase(validateCode.getValidateCode())) //忽略大小写匹配
页面的