加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

自己封装的一个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!!!

?下载源文件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读