shushanfx
2014-12-22 12:02:59
基于java Servlet的验证码生成代码
最近做了一个java验证码的生成的servlet。不多说,直接上代码:
package com.shushanfx.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 产生验证码图片的servlet */ public class ValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = -5051097528828603895L; /** * 验证码session的名称。 */ private static final String SESSION_ATT_NAME = "validateCode"; /** * 验证码图片的宽度。 */ private int width = 100; /** * 验证码图片的高度。 */ private int height = 30; /** * 验证码字符个数 */ private int codeCount = 4; /** * 字体高度 */ private int fontHeight; /** * 第一个字符的x轴值,因为后面的字符坐标依次递增,所以它们的x轴值是codeX的倍数 */ private int codeX; /** * codeY ,验证字符的y轴值,因为并行所以值一样 */ private int codeY; /** * codeSequence 表示字符允许出现的序列值 */ char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; /** * 初始化验证图片属性 */ public void init() throws ServletException { // 从web.xml中获取初始信息 // 宽度 String strWidth = this.getInitParameter("width"); // 高度 String strHeight = this.getInitParameter("height"); // 字符个数 String strCodeCount = this.getInitParameter("codeCount"); // 将配置的信息转换成数值 try { if (strWidth != null && strWidth.length() != 0) { width = Integer.parseInt(strWidth); } if (strHeight != null && strHeight.length() != 0) { height = Integer.parseInt(strHeight); } if (strCodeCount != null && strCodeCount.length() != 0) { codeCount = Integer.parseInt(strCodeCount); } } catch (NumberFormatException e) { e.printStackTrace(); } //width-4 除去左右多余的位置,使验证码更加集中显示,减得越多越集中。 //codeCount+1 //等比分配显示的宽度,包括左右两边的空格 codeX = (width-4) / (codeCount+1); //height - 10 集中显示验证码 fontHeight = height - 10; codeY = height - 7; } /** * @param request * @param response * @throws ServletException * @throws java.io.IOException */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // 定义图像buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D gd = buffImg.createGraphics(); // 创建一个随机数生成器类 Random random = new Random(); // 将图像填充为白色 gd.setColor(Color.LIGHT_GRAY); gd.fillRect(0, 0, width, height); // 创建字体,字体的大小应该根据图片的高度来定。 Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); // 设置字体。 gd.setFont(font); // 画边框。 gd.setColor(Color.BLACK); gd.drawRect(0, 0, width - 1, height - 1); // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。 gd.setColor(Color.gray); for (int i = 0; i < 16; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); gd.drawLine(x, y, x + xl, y + yl); } // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 StringBuffer randomCode = new StringBuffer(); int red = 0, green = 0, blue = 0; // 随机产生codeCount数字的验证码。 for (int i = 0; i < codeCount; i++) { // 得到随机产生的验证码数字。 String strRand = String.valueOf(codeSequence[random.nextInt(36)]); // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。 red = random.nextInt(255); green = random.nextInt(255); blue = random.nextInt(255); // 用随机产生的颜色将验证码绘制到图像中。 gd.setColor(new Color(red,green,blue)); gd.drawString(strRand, (i + 1) * codeX, codeY); // 将产生的四个随机数组合在一起。 randomCode.append(strRand); } // 将四位数字的验证码保存到Session中。 HttpSession session = request.getSession(); session.setAttribute(SESSION_ATT_NAME, 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(); } public static String getValidateCode(HttpServletRequest request){ HttpSession session = request.getSession(); Object obj = session.getAttribute(SESSION_ATT_NAME); if(obj!=null){ return obj.toString(); } return ""; } public static void removeValidateCode(HttpServletRequest request){ HttpSession session = request.getSession(); session.removeAttribute(SESSION_ATT_NAME); } }
方法或属性 | 描述 | 是否static |
init() | servlet初始化 | 否 |
service() | servlet服务方法,生成验证码,并输出图像。 | 否 |
getValidateCode | 传入request对象,获取验证码字符串 | 是 |
removeValidateCode | 传入request对象,清除保存在session中的属性 | 是 |
SESSION_ATTR_NAME | validateCode,session 属性的名称。 |
是(private) |
width,height,codeCount | 验证码属性,分别定义宽度(默认100),高度(默认30),字符数(默认4) 这些属性可以通过web.xml配置。 |
否 |
Web.xml配置:
ps:如果项目中使用了springMVC,请将该配置放置在springMVC之前。
由最代码官方编辑于2014-12-22 14:28:20
猜你喜欢
- java Servlet生成验证码图片工具类代码
- java servlet插入图片到oracle数据库并读取到浏览器Demo
- godson Easyui+plupload实现批量上传文件,图片(兼容全部常用浏览器)的demo实例
- java servlet无刷新上传图片文件并裁剪demo代码(Jcrop)
- jsp/servlet 表单上传图片、但不能传值了、或传值中文乱码问题解决
- java servlet实现上传文件代码及其原理说明
- java servlet开发购物车功能,实现增删改查结算等功能。
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- java servlet对html网页压缩后返回的过滤器代码实现
- java web servlet文件上传到服务器源代码下载
- 用servlet写的JPetStore,实现了全部基本功能
- java servlet Filter的入门实例源代码下载
请下载代码后再发表评论

- jsp/servlet 表单上传图片、但不能传值了、或传值中文乱码问题解决
- java servlet实现上传文件代码及其原理说明
- java servlet开发购物车功能,实现增删改查结算等功能。
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- 原证精 java servlet对html网页压缩后返回的过滤器代码实现
- 原 java web servlet文件上传到服务器源代码下载
- 用servlet写的JPetStore,实现了全部基本功能
- java servlet Filter的入门实例源代码下载
- java Servlet导出Excel的一个简单demo,不会受到框架的影响
- java servlet页面表格导出Excel(csv格式和xls格式都可以)
- 证 java Servlet生成验证码图片工具类代码
- 证精 java servlet Filter实现gzip压缩机制的源代码分享


哪里的完整版 LV8
2024年9月3日
invictuslee LV4
2024年4月2日
磊哥哥哥哥 LV13
2023年11月28日
95959595959 LV13
2023年4月20日
感冒灵颗粒 LV1
2023年3月17日
3174233007
2022年12月19日
暂无贡献等级
张好好 LV1
2022年10月26日
MarkLee 琥珀川 LV13
2022年1月25日
Q375892799 LV9
2022年1月22日
采暖11 LV11
2021年12月6日