自己封装的一个java图片验证码
发布时间:2020-12-15 06:48:04 所属栏目:Java 来源:网络整理
导读:验证码生成器: ? 1 package com.lz.Tools; 2 3 import java.awt.Color; 4 java.awt.Font; 5 java.awt.Graphics; 6 java.awt.Graphics2D; 7 java.awt.image.BufferedImage; 8 java.util.Random; 9 10 /** 11 * 验证码生成器 12 * 13 * @author bojiangzhou 1
验证码生成器: ? 1 package com.lz.Tools; 2 3 import java.awt.Color; 4 java.awt.Font; 5 java.awt.Graphics; 6 java.awt.Graphics2D; 7 java.awt.image.BufferedImage; 8 java.util.Random; 9 10 /** 11 * 验证码生成器 12 * 13 * @author bojiangzhou 14 */ 15 public class VCodeGenerator { 16 17 18 * 验证码来源 19 20 final private char[] code = { 21 '2','3','4','5','6','7','8','9', 22 'a','b','c','d','e','f','g','h','i','j' 23 'k','m','n','p','q','r','s','t','u','v' 24 'w','x','y','z','A','B','C','D','E','F' 25 'G','H','J','K','L','M','N','P','Q','R' 26 'S','T','U','V','W','X','Y','Z' 27 }; 28 29 * 字体 30 31 private String[] fontNames = new String[]{ 32 "黑体","宋体","Courier","Arial" 33 "Verdana","Times","Tahoma","Georgia"}; 34 35 * 字体样式 36 37 int[] fontStyles = new int[]{ 38 Font.BOLD,Font.ITALIC|Font.BOLD 39 40 41 42 * 验证码长度 43 * 默认4个字符 44 45 int vcodeLen = 4; 46 47 * 验证码图片字体大小 48 * 默认17 49 50 int fontsize = 21 51 52 * 验证码图片宽度 53 54 int width = (fontsize+1)*vcodeLen+10 55 56 * 验证码图片高度 57 58 int height = fontsize+12 59 60 * 干扰线条数 61 * 默认3条 62 63 int disturbline = 3 64 65 66 public VCodeGenerator(){} 67 68 69 * 指定验证码长度 70 * @param vcodeLen 验证码长度 71 72 public VCodeGenerator( vcodeLen) { 73 this.vcodeLen = vcodeLen; 74 this.width = (fontsize+1)*vcodeLen+10 75 } 76 77 78 * 生成验证码图片 79 vcode 要画的验证码 80 drawline 是否画干扰线 81 @return 82 83 public BufferedImage generatorVCodeImage(String vcode,boolean drawline){ 84 //创建验证码图片 85 BufferedImage vcodeImage = BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 86 Graphics g = vcodeImage.getGraphics(); 87 填充背景色 88 g.setColor(new Color(246,240,250)); 89 g.fillRect(0,0 90 if(drawline){ 91 drawDisturbLine(g); 92 } 93 用于生成伪随机数 94 Random ran = Random(); 95 在图片上画验证码 96 for(int i = 0;i < vcode.length();i++){ 97 设置字体 98 g.setFont( Font(fontNames[ran.nextInt(fontNames.length)],fontStyles[ran.nextInt(fontStyles.length)],fontsize)); 99 随机生成颜色 100 g.setColor(getRandomColor()); 101 画验证码 102 g.drawString(vcode.charAt(i)+"",i*fontsize+10,fontsize+5); 103 104 释放此图形的上下文以及它使用的所有系统资源 105 g.dispose(); 106 107 return vcodeImage; 108 109 110 * 获得旋转字体的验证码图片 111 vcode 112 113 114 115 public BufferedImage generatorRotateVCodeImage(String vcode,1)">116 117 BufferedImage rotateVcodeImage = 118 Graphics2D g2d = rotateVcodeImage.createGraphics(); 119 120 g2d.setColor(121 g2d.fillRect(0,1)">122 123 drawDisturbLine(g2d); 124 125 126 127 BufferedImage rotateImage = getRotateImage(vcode.charAt(i)); 128 g2d.drawImage(rotateImage,1)">null,(int) (this.height * 0.7) * i,1)">129 130 g2d.dispose(); 131 rotateVcodeImage; 132 133 134 * 生成验证码 135 @return 验证码 136 137 String generatorVCode(){ 138 int len = code.length; 139 Random ran = 140 StringBuffer sb = StringBuffer(); 141 int i = 0;i < vcodeLen;i++142 int index = ran.nextInt(len); 143 sb.append(code[index]); 144 145 sb.toString(); 146 147 148 * 为验证码图片画一些干扰线 149 g 150 151 void drawDisturbLine(Graphics g){ 152 Random ran = 153 int i = 0;i < disturbline;i++154 int x1 = ran.nextInt(width); 155 int y1 = ran.nextInt(height); 156 int x2 =157 int y2 =158 159 画干扰线 160 g.drawLine(x1,y1,x2,y2); 161 162 163 164 * 获取一张旋转的图片 165 c 要画的字符 166 167 168 private BufferedImage getRotateImage(char c){ 169 BufferedImage rotateImage = BufferedImage(height,BufferedImage.TYPE_INT_ARGB); 170 Graphics2D g2d = rotateImage.createGraphics(); 171 设置透明度为0 172 g2d.setColor(new Color(255,1)">173 g2d.fillRect(0,1)">174 Random ran = 175 g2d.setFont(176 g2d.setColor(getRandomColor()); 177 double theta = getTheta(); 178 旋转图片 179 g2d.rotate(theta,height/2,height/2180 g2d.drawString(Character.toString(c),(height-fontsize)/2,1)">181 182 183 rotateImage; 184 185 186 返回一个随机颜色 187 188 private Color getRandomColor(){ 189 Random ran = 190 return new Color(ran.nextInt(220),ran.nextInt(220),ran.nextInt(220)); 191 192 193 角度 194 195 double getTheta(){ 196 return ((int) (Math.random()*1000) % 2 == 0 ? -1 : 1)*Math.random(); 197 198 199 200 验证码字符个数 201 202 getVcodeLen() { 203 204 205 206 * 设置验证码字符个数 207 vcodeLen 208 209 void setVcodeLen(210 this.width = (fontsize+3)*vcodeLen+10211 212 213 214 字体大小 215 216 getFontsize() { 217 fontsize; 218 219 220 * 设置字体大小 221 fontsize 222 223 void setFontsize( fontsize) { 224 225 this.height = fontsize+15226 this.fontsize =227 228 229 图片宽度 230 231 getWidth() { 232 width; 233 234 235 * 设置图片宽度 236 width 237 238 void setWidth( width) { 239 this.width =240 241 242 图片高度 243 244 getHeight() { 245 height; 246 247 248 * 设置图片高度 249 height 250 251 void setHeight( height) { 252 this.height =253 254 255 干扰线条数 256 257 getDisturbline() { 258 disturbline; 259 260 261 * 设置干扰线条数 262 disturbline 263 264 void setDisturbline( disturbline) { 265 this.disturbline =266 267 268 } ? 在servlet里获取验证码 1 com.lz.Servlet; 2 3 4 java.io.IOException; 5 6 javax.imageio.ImageIO; 7 javax.servlet.ServletException; 8 javax.servlet.http.HttpServlet; 9 javax.servlet.http.HttpServletRequest; 10 javax.servlet.http.HttpServletResponse; 11 12 com.lz.Tools.VCodeGenerator; 13 14 15 16 17 * 获取验证码 18 19 * 20 21 class GetVCodeServlet extends HttpServlet { 22 23 static long serialVersionUID = 3259532010990625726L24 25 void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { 26 验证码不能缓存 27 response.setHeader("Expires","-1"28 response.setHeader("cache-control","no-cahce"29 response.setHeader("pragma","no-cache"30 31 VCodeGenerator vcg = VCodeGenerator(); 32 取得验证码 33 String vcode = vcg.generatorVCode(); 34 获取验证码图片 35 BufferedImage vcodeImage = vcg.generatorRotateVCodeImage(vcode,true); 36 BufferedImage vcodeImage = vcg.generatorVCodeImage(vcode,1)">true37 将验证码保存到session域对象 38 request.getSession().setAttribute("vcode"39 输出验证码图片 40 ImageIO.write(vcodeImage,"gif"41 42 43 } ? 前台在img标签里用src获取验证码图片即可 <img ="vcode" src="GetVCodeServlet" /> ? OK!!! ?下载源文件 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |