J2EE开发技术点2:图形验证码
来源:互联网 发布:编程技术教学 编辑:程序博客网 时间:2024/06/07 00:28
前言
验证码技术被广泛运用于网站中,使用验证码可以有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是一种登录保护措施。由于验证码是动态生成的,在使用暴力破解的时候难度加大,所以验证码技术是一种常用却简单的技术。下面就介绍如何使用Java动态生成验证码
创建一个表单
实现思路
由于要产生随机验证码,所以有一个出现字符的范围,这里仅考虑了a-z、A-Z、0-9这个范围,然后设置随机颜色、并进行画矩形、画线、设置字体、绘制随机字符。
实现代码:
package com.hrms.sys.utils;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class VerifyCode { private static String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; private static int width = 60; private static int height = 22; private static int len = 30; public static void getVerifyCode(HttpServletRequest request, HttpServletResponse response) { //设置响应头无缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); //创建一个图像缓冲区 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //创建一个画笔 Graphics g = image.getGraphics(); Random random = new Random(); //设置画笔随机颜色 g.setColor(getRandColor(220, 250)); //画矩形 g.fillRect(0, 0, width, height); //设置字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); g.draw3DRect(0, 0, width - 2, height - 2, true); //设置画线的随机颜色 g.setColor(getRandColor(160, 200)); //随机画30条线段 for (int i = 0; i < len; 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); } //要显示的验证码 String sRand = ""; //验证码为4个随机字符 for (int i = 0; i < 4; i++) { char rand = s.charAt(random.nextInt(s.length())); sRand += rand; //设置画随机字符的颜色 g.setColor(new Color(20 + random.nextInt(110), random.nextInt(110), random.nextInt(110))); //验证码的范围在s中 g.drawString(String.valueOf(rand), 13 * i + 6, 16); } request.getSession().setAttribute("VerifyCode", sRand); g.dispose(); ServletOutputStream output; try { //输出显示到浏览器中 output = response.getOutputStream(); ImageIO.write(image, "JPEG", output); } catch (IOException e) { e.printStackTrace(); } } //获取随机颜色rgb的值 private static Color getRandColor(int fc, int bc) { Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); }}
验证码优化
上面的验证码有一个bug,就是必须每次刷新浏览器才能显示不同的验证码,那怎么才能直接点击验证码就换一张验证码呢?其实思路很简单,就是把验证码做成一个链接,每次点击验证码,就再发送一次请求即可。
效果如下:
这样就可以很方便更换验证码了。
0 0
- J2EE开发技术点2:图形验证码
- J2EE开发技术点4:ajax技术
- J2EE开发技术点3:文件上传下载
- J2EE开发技术点1:Tomcat中开发项目
- J2EE开发技术点5:Tomcat jdbc pool
- J2EE开发技术点6:Proxool数据库连接池
- 三维图形技术点
- J2EE开发---验证码(一)
- 服务器开发之图形验证码
- 短信验证码开发教程 - 3.图形验证码篇
- 图形码 图形验证码
- J2EE开发---验证码(二)----kaptcha框架
- j2ee-验证码
- j2ee开发的各种技术
- J2EE开发技术基础入门
- J2EE开发技术全接触
- 使用 JCaptcha 开发图形和声音验证码
- 使用 JCaptcha 开发图形和声音验证码
- Delphi十进制和十六进制互转
- svn 终端常用命令
- Linux下MySQL源码编译安装(eg:mysql-5.6.27.tar.gz )
- List<T>
- JAVA基础之基本规则
- J2EE开发技术点2:图形验证码
- Python的decorator学习笔记
- OpenStack--简介
- Caffe中learning rate 和 weight decay 的理解
- 【leetcode】【46】Permutations
- 嵌入式操作系统学习笔记:01.书籍与OS源码选择
- 实战 Mantle 解析界面app 科技频道
- C++primer plus第六版课后编程练习答案5.3
- 桌面端ViewPort的故事(一)