生成随机验证码——(一)

来源:互联网 发布:复制门禁卡软件 编辑:程序博客网 时间:2024/05/16 14:56

在用户登录某个网站时,为了网站为了防止恶意访问,会要求用户输入用户账户和密码外,还需要输入一个随机验证码。随机验证码是一副嵌入在浏览器中的图片,随机验证码通常是在服务器端生成的,当然有些是在客户端生成。这里将会对服务器端和客户端的验证码分别进行说明。通常来说,随机验证码是有服务器端生成,验证码的校验也是放在服务器端验证的,服务器端保存了一份验证码(通常保存在session中),当用户从客服端输入验证码,并将其发送到服务器段进行验证。这个可以写成一个工具类,包括一个随机数字(这里是4位阿拉伯数字)生成器,及一个将此随机数字写入到浏览器的方法。

生成随机验证码,主要需要使用到的类有:

BufferedImage, 主要是用来在内存中申请一块图像缓存Graphics2D 此类为一个面板图像,可以再次对象上进行绘画,此对象是通过BufferedImage对象的getGraphics()方法得到的ImageIO, 图像IO,可以通过调用此方法的write方法,将BufferedImage对象写入到浏览器中。
具体代码如下:

public class ImageCheckCodeUtils {public static void getImageCode(HttpServletResponse response)throws ServletException, IOException {//6.设置头,控制浏览器不要缓存图片数据response.setHeader("Expires", "-1");response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");//5.通知浏览器以图片方式打开response.setHeader("Content-type", "image/jpeg");//1.在内存中创建一副图片BufferedImage image = new BufferedImage(60,20,BufferedImage.TYPE_INT_RGB);//2.得到图片Graphics2D  g = (Graphics2D) image.getGraphics();//设置图片背景色g.setColor(new Color(55, 165, 205));g.fillRect(0, 0, 60, 20);//3.向图片上写数据g.setColor(Color.BLUE);g.setFont(new Font(null,Font.BOLD,20));String checkcode = makeNum();//request.getSession().setAttribute("checkcode", checkcode);g.drawString(checkcode, 0, 20);//4.将图片写给浏览器ImageIO.write(image, "jpg", response.getOutputStream());}private static String makeNum() {Random r = new Random();String num = r.nextInt(9999) + "";  //0-9999999  123  1234567StringBuffer sb = new StringBuffer();for(int i=0;i<4-num.length();i++){sb.append("0");}num = sb.toString()+num;return num;}}
上面示例仅仅是生成一个4位随机验证码,但是在实际应用中,我们能发现,随机验证码存在一定的干扰,比如故意做成清晰度不好的,或者增加一定干扰。

0 0
原创粉丝点击