java springmvc验证码_springMVC--动态验证码实现

在网站开发过程中我们一般都会为了防止用户连续提交都会提供验证码的功能,简单来说就是生成一个动态图片,在图片中保存一些校验信息,将校验信息放到session中和用户提交的验证码信息进行对比,如果出现错误则要提示验证码错误。

提供一个简单实现的demo。

@Controller

@RequestMapping("/auth")

publicclassAuthCodeController {

privatechar[] codeSequence = {'A','1','B','C','2','D','3','E','4','F','5','G','6','H','7','I','8','J',

'K','9','L','1','M','2','N','P','3','Q','4','R','S','T','U','V','W',

'X','Y','Z'};

@RequestMapping("/code")

publicvoidgetCode(HttpServletResponse response,HttpSession session)throwsIOException{

intwidth =63;

intheight =37;

Random random = newRandom();

//设置response头信息

//禁止缓存

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires",0);

//生成缓冲区image类

BufferedImage image = newBufferedImage(width, height,1);

//产生image类的Graphics用于绘制操作

Graphics g = image.getGraphics();

//Graphics类的样式

g.setColor(this.getColor(200,250));

g.setFont(newFont("Times New Roman",0,28));

g.fillRect(0,0, width, height);

//绘制干扰线

for(inti=0;i<40;i++){

g.setColor(this.getColor(130,200));

intx = random.nextInt(width);

inty = random.nextInt(height);

intx1 = random.nextInt(12);

inty1 = random.nextInt(12);

g.drawLine(x, y, x + x1, y + y1);

}

//绘制字符

String strCode = "";

for(inti=0;i<4;i++){

String rand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);

strCode = strCode + rand;

g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

g.drawString(rand, 13*i+6,28);

}

//将字符保存到session中用于前端的验证

session.setAttribute("authCode", strCode.toLowerCase());

g.dispose();

ImageIO.write(image, "JPEG", response.getOutputStream());

response.getOutputStream().flush();

}

publicColor getColor(intfc,intbc){

Random random = newRandom();

if(fc>255)

fc = 255;

if(bc>255)

bc = 255;

intr = fc + random.nextInt(bc - fc);

intg = fc + random.nextInt(bc - fc);

intb = fc + random.nextInt(bc - fc);

returnnewColor(r,g,b);

}

}@Controller

@RequestMapping("/auth")

public class AuthCodeController {

private char[] codeSequence = { 'A', '1','B', 'C', '2','D','3', 'E','4', 'F', '5','G','6', 'H', '7','I', '8','J',

'K', '9' ,'L', '1','M', '2','N', 'P', '3', 'Q', '4', 'R', 'S', 'T', 'U', 'V', 'W',

'X', 'Y', 'Z'};

@RequestMapping("/code")

public void getCode(HttpServletResponse response,HttpSession session) throws IOException{

int width = 63;

int height = 37;

Random random = new Random();

//设置response头信息

//禁止缓存

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

//生成缓冲区image类

BufferedImage image = new BufferedImage(width, height, 1);

//产生image类的Graphics用于绘制操作

Graphics g = image.getGraphics();

//Graphics类的样式

g.setColor(this.getColor(200, 250));

g.setFont(new Font("Times New Roman",0,28));

g.fillRect(0, 0, width, height);

//绘制干扰线

for(int i=0;i<40;i++){

g.setColor(this.getColor(130, 200));

int x = random.nextInt(width);

int y = random.nextInt(height);

int x1 = random.nextInt(12);

int y1 = random.nextInt(12);

g.drawLine(x, y, x + x1, y + y1);

}

//绘制字符

String strCode = "";

for(int i=0;i<4;i++){

String rand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);

strCode = strCode + rand;

g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

g.drawString(rand, 13*i+6, 28);

}

//将字符保存到session中用于前端的验证

session.setAttribute("authCode", strCode.toLowerCase());

g.dispose();

ImageIO.write(image, "JPEG", response.getOutputStream());

response.getOutputStream().flush();

}

public Color getColor(int fc,int bc){

Random random = new Random();

if(fc>255)

fc = 255;

if(bc>255)

bc = 255;

int r = fc + random.nextInt(bc - fc);

int g = fc + random.nextInt(bc - fc);

int b = fc + random.nextInt(bc - fc);

return new Color(r,g,b);

}

}在jsp文件中请求这个图片地址

code效果:

JL0t1VZFQBFQBMZI4P8BXt0XiSb0abwAAAAASUVORK5CYII=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值