- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
用久了模板和工具,使用最普通的servlet和jsp,手动画一个验证码,随心搭配。
知识点梳理及部分源码解析:
想要绘画一个图案,首先需要获得画板和画笔!
- 通过BufferedImage类下面的构造方法,源码看下图,可以自定义设置一个width,height,imageType属性的画板,imageType种类丰富。
- 通过BufferedImage类下面的成员方法,有两种画笔源码看下图,本文选择第一种来绘画,java.awt.Graphics是一个用来绘制2D图像必须导入的java包,提供对图形图像的像素,颜色的绘制等。以此可以设置验证码颜色,大小,字体等等。
页面绘画完毕后,接下来,写一下业务逻辑,添加验证码内容以及获取方式!
- 自定义一个验证码输出内容字符串,可使用StringBuffer,来自定义随机获取内容数量,(对,手画的好处就是这么随意),用到一个方法:document.getElementById('id值').src="路径",此方法写在jsp中,用于验证码随机生成替换。
话不多说,附上源码!
servlet代码
import java.util.Random;
import java.util.stream.IntStream;
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("image/jpeg");
OutputStream os = resp.getOutputStream();
//画板
BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);
//画笔
Graphics g = image.getGraphics();
//给验证码设置颜色,大小,位置等
Random r = new Random();
g.setColor(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
g.fillRect(0,0,60,20);
g.setColor(Color.black);
g.setFont(new Font(null,Font.BOLD,15));
g.drawString(getNum(5),5,15);
//添加线条,增加验证码辨认难度
IntStream.range(0,5).forEach(key->{
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
g.drawLine(r.nextInt(30),r.nextInt(10),r.nextInt(30),r.nextInt(10));
});
//输出
ImageIO.write(image,"jpeg",os);
}
private String getNum(int length){
String str = "ABCDEFGHIGKLMNOPQRSTUVWXYZ23456789";
Random random = new Random();
StringBuffer sbf = new StringBuffer();
for (int i = 0; i < length; i++) {
int index = random.nextInt(str.length());
char c = str.charAt(index);
sbf.append(c);
}
return sbf.toString();
}
}
页面部分
效果图