随机验证码这个在登录页面,注册页面是经常使用的,本文使用的验证码技术还有混淆条纹,安全级别更高。我也是参考人家的技术,然后在项目中得以使用,这里将使用方法总结一下,供大家参考。
第一步、创建随机验证码生成类RandomValidateCode.java
/**
*
*/
package com.shengpay.mpos.service.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.shengpay.mpos.service.MemcachedService;
/**
* 验证码生成类
* @author zhuzhifei
*
*/
public class RandomValidateCode {
@Autowired
MemcachedService<String> memcachedService;
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);
}
/**
* 生成随机图片
*/
public void getRandcode(HttpServletRequest request,
HttpServletResponse response) {
//HttpSession session = request.getSession();
//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 = "";
for(int i=1;i<=stringNum;i++){
randomString=drowString(g,randomString,i);
}
// session.removeAttribute(RANDOMCODEKEY);
// session.setAttribute(RANDOMCODEKEY, randomString);
// session.removeAttribute(randomString);
// session.setAttribute(randomString, randomString);
memcachedService.delete(randomString);
memcachedService.put(randomString, randomString);
System.out.println(randomString);
g.dispose();
try {
ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 绘制字符串
*/
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));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
第二步、编写Controller相当于servlet获取验证码方法
@RequestMapping(value = "/manage/getRandomCode.htm")
public void getRandomCode(HttpServletRequest request, HttpServletResponse response,ModelMap model) {
response.setContentType("image/jpeg");
//设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma", "No-cache");
//设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
try {
randomValidateCode.getRandcode(request, response);
} catch (Exception e) {
// TODO: handle exception
}
}
第三步、web页面使用
function refresh(obj) {
obj.src = "#springUrl('/manage/getRandomCode.htm')?"+Math.random();
}
function refreshRandowCode() {
document.getElementById("imgRandomCode").src="#springUrl('/manage/getRandomCode.htm')?"+Math.random();
}
<tr>
<td height="35" class="login-text02">验证图片:<br /></td>
<td><img src="#springUrl('/manage/getRandomCode.htm')" style="cursor:hand" id="imgRandomCode" οnclick="javascript:refresh(this);" width="109" height="40" /> <a href="#" οnclick="javascript:refreshRandowCode();" class="login-text03">看不清楚,换张图片</a></td>
</tr>
OK,就这么使用了。希望对你有帮助~