<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Graphics2D"%>
<%@page import="java.awt.Color"%>
<%@page import="java.awt.Font"%>
<%@page import="javax.imageio.ImageIO"%>

<%
int width = 60;
int height = 20;
// 创建具有可访问图像数据缓冲区的Image
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();

// 创建一个随机数生成器
Random random = new Random();

g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);

// 创建字体,字体的大小应该根据图片的高度来定
Font font = new Font("Times New Roman", Font.PLAIN, 24);
// 设置字体
g.setFont(font);

// 画边框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);

// 随机产生160条干扰线
g.setColor(Color.LIGHT_GRAY);
for (int i = 0; i < 160; i++) {
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);
}

// randomCode 用于保存随机产生的验证码
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;

// 随机产生4位数字的验证码
for (int i = 0; i < 4; i++) {
// 得到随机产生的验证码数字
String strRand = String.valueOf(random.nextInt(10));

// 产生随机的颜色分量来构造颜色值
red = random.nextInt(110);
green = random.nextInt(50);
blue = random.nextInt(50);

// 用随机产生的颜色将验证码绘制到图像中
g.setColor(new Color(red, green, blue));
g.drawString(strRand, 13 * i + 6, 16);

randomCode.append(strRand);
}

// 将四位数字的验证码保存到session中
//HttpSession session1 = request.getSession();
session.setAttribute("randomCode", randomCode.toString());

// 禁止图像缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);

response.setContentType("image/jpeg");
// 将图像输出到servlet输出流中
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
//sos = null;
out.clear();
out = pageContext.pushBody();
%>

前台页面调用:

<img src="<%=path %>/image.jsp" width="43" height="17" />

最新文章

  1. [LeetCode] Roman to Integer 罗马数字转化成整数
  2. ubuntu Server 14 自动更新
  3. DNS与DNS劫持原理、IP、域名、服务器访问浅讲
  4. Project Euler 92:Square digit chains 平方数字链
  5. 什么是C#,.NET,ASP.NET?
  6. GitHub+hexo to Blog
  7. 《JavaScript+DOM编程艺术》的摘要(一)---基本知识点
  8. 【BZOJ1552】[Cerc2007]robotic sort Splay
  9. ES6核心内容精讲--快速实践ES6(三)
  10. day02 解释器安装及初识变量
  11. Gradle 简记
  12. servlet异步处理机制
  13. 通过T-SQL语句实现数据库加解密功能
  14. Codeforces 954 G. Castle Defense
  15. modbus协议说明(转)
  16. 【版本发布】JAVA微服务开发框架,Jeecg-P3 1.0.0 重构版本发布
  17. SQLServer 的数据分页:
  18. 在 Azure Resource Manager 中为虚拟机设置密钥保管库
  19. 格式化输出函数:printf 那些事 (C语言)
  20. 分布式系统唯一ID生成方案汇总 转

热门文章

  1. js事件处理函数中return的作用
  2. linux的bash与sh的区别
  3. 爬虫入门【11】Pyspider框架入门—使用HTML和CSS选择器下载小说
  4. Java读取、创建Excel;验签,加密
  5. Windows File 管理工具:junction And Subinacl
  6. Word Formation
  7. mysql source 执行sql脚本,中文变量不显示问题或乱码问题
  8. &lt;2014 05 09&gt; 程序员:从C++转到Java需注意的地方
  9. &quot;零代码”开发B/S企业管理软件之一 :怎么创建数据库表
  10. 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国