1.jsp页面显示验证码,src跳转到Controller里的:getImg_validate,reloadImg()作用是点击验证码就会换一张(重新请求getImg_validate)
- 验证码:
functionreloadImg() {
document.getElementById("img_validate").src="image/getImg_validate";
}
View Code
2.写一个ImageUtil工具类,在里面可以自定义图片生成的大小,字体大小,背景色,验证码个数,干扰线条条数等等
packagecom.svse.house.util;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.image.BufferedImage;importjava.util.Random;public classImageUtil {//1.定义变量保存生成后的验证码字符串
static String code = "";//2.生成验证码
public staticString createcode() {
code= "";
String a= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";//随机生成的字符范围(0-9,a-z,A-Z)//生成验证码的位数(这里是4位)
for (int i = 0; i < 4; i++) {int index = (int) (Math.random() * 62);//会产生一个[0,62)的数,不包含小数
char b =a.charAt(index);
code= code +b;
}returncode;
}//查看已经生成的验证码
public staticString getCode() {returncode;
}//3.生成图片
public staticBufferedImage createimage() {//前2个参数为:width, height.后面是图像类型//创建一个不带透明色的BufferedImage对象,TYPE_INT_ARGB为带透明色
BufferedImage bi = new BufferedImage(130,50, BufferedImage.TYPE_INT_RGB);//1.得到一个画布
Graphics g =bi.getGraphics();//2.添加背景颜色
g.setColor(Color.WHITE);
g.fillRect(0, 0, 130, 50);//3.添加干扰线
for (int i = 0; i < 10; i++) {
Random r= newRandom();int red = r.nextInt(256);int green = r.nextInt(256);int blue = r.nextInt(256);
Color c= newColor(red, green, blue);
g.setColor(c);int x1 = r.nextInt(131);int y1 = r.nextInt(51);int x2 = r.nextInt(131);int y2 = r.nextInt(51);
g.drawLine(x1,y1,x2,y2);//画线//g.drawOval(x1, y1, x2, y2);//画曲线
}//3.添加文字
g.setColor(Color.BLACK);
g.setFont(new Font("宋体", Font.BOLD, 50));
String str=getCode();//4.将文字填充到画板中
g.drawString(str, 15, 40);//5.关闭画布
g.dispose();returnbi;
}
}
View Code
3.在controller层调用getImg_validate,试用过jpeg和bmp格式的setContentType,都可以
packagecom.svse.house.controller;importjava.awt.image.BufferedImage;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjavax.imageio.ImageIO;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importcom.svse.house.util.ImageUtil;
@Controller
@RequestMapping("/image")public classImageController {
@RequestMapping("/getImg_validate")public voidyanzheng(HttpServletResponse response){try{
ImageUtil.createcode();
BufferedImage image=ImageUtil.createimage();//以流的方式返回给客户端
response.setContentType("image/jpeg");//response.setContentType("image/bmp");
ByteArrayOutputStream bt = newByteArrayOutputStream();//将图片转换成字节流
ImageIO.write(image,"jpeg",bt);//ImageIO.write(image,"bmp",bt);//得到输出流,返回客户端
ServletOutputStream outputStream =response.getOutputStream();
outputStream.write(bt.toByteArray());
}catch(IOException e) {
e.printStackTrace();
}
}
}
View Code
4.最后的验证
当时一直想在前台获取随机生成的四位数验证码来和自己输入的进行比较,可以通过session来获取但如果刷新验证码session里的值不会改变除非刷新整个页面。
后来想想真傻,直接在后台比较不就好了吗。