/** * 生成随机验证码 * @return * @throws Exception */ public ByteArrayInputStream randomYzm() throws Exception{ char[] codes={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; int width=62, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 生成随机类 Random random = new Random(); // 设定背景色 g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Fixedsys",Font.PLAIN,20)); // 随机产生100条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(Color.lightGray); for (int i=0;i<100;i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x,y,x+xl,y+yl); } // 取随机产生的认证码(4位数字) StringBuilder sRand = new StringBuilder(4); for (int i=0;i<4;i++){ String rand=String.valueOf(codes[random.nextInt(32)]); // sRand+=rand; sRand.append(rand); // 将认证码显示到图象中 g.setColor(new Color(random.nextInt(55),random.nextInt(55),random.nextInt(55))); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand,15*i,16); } //图象生效 g.dispose(); ByteArrayInputStream input=null; ByteArrayOutputStream output = new ByteArrayOutputStream(); try{ ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); ImageIO.write(image, "JPEG", imageOut); imageOut.close(); input = new ByteArrayInputStream(output.toByteArray()); }catch(Exception e){ throw new Exception("验证码图片产生出现错误"); } // images=input;/* 赋值图像 */ ActionContext.getContext().getSession().put("randomyzm", sRand.toString());//取得随机字符串放入HttpSession return input; }
