基于servlet环境 如下简单生成图形验证码
1)添加新类,如下代码
@WebServlet("/randomCode")
public class RandomCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//生成随机数
String randomCode = UUID.randomUUID().toString().substring(0, 5);
//把随机数放进Session中
req.getSession().setAttribute("RANDOMCODE_IN_SESSION", randomCode);
//创建图片对象
int width = 80;
int height = 40;
int imageType = BufferedImage.TYPE_INT_RGB;
BufferedImage image = new BufferedImage(width, height, imageType);
//画板
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
//绘制一个实心的矩形
g.fillRect(1, 1, width - 2, height - 2);
//把随机数画进图片中
g.setColor(Color.BLACK);//设置随机数的颜色
Font font = new Font("宋体", Font.BOLD + Font.ITALIC, 20);
g.setFont(font);//设置随机数的字体和大小
g.drawString(randomCode, 10, 28);
//干扰线
g.setColor(Color.GRAY);
Random r = new Random();
for (int i = 0; i < 100; i++) {
g.fillRect(r.nextInt(width), r.nextInt(height), 2, 2);
}
//关闭
g.dispose();
//把图片对象以流的方式保存出去
ImageIO.write(image, "jpg", resp.getOutputStream());
}
}
在login.jsp中的img元素如下配置即可看到效果
<img src="/randomCode">
验证码登录实现原理:
1)当访问登录页面时,当显示验证码图片之前,先访问该生成验证码的资源文件
2)该资源文件生成验证码保存到session中,并将验证码图片响应给客户端
3)当用户登录时,先判断用户提交上来的验证码是否跟session中的验证码匹配,否则验证不通过,跳转登录页面