简单版:带干扰线的图形验证码生成

2022-04-13 08:52:01 浏览数 (1)

1.生成工具类;

import java.awt.Color;

代码语言:javascript复制
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

/**
 * 登陆图形验证码生成工具类
 * @author JiangYu
 */
public class ImageCreate {
    
    public static void main(String[] args)throws Exception {
    	//测试
    	new ImageCreate().create();     
    }
    
    //验证码字符串
    private String codeV;
    
    public String getCode() {
		return codeV;
	}
	//生成验证码
    public BufferedImage create() throws Exception {
	     // 大小
	     int width = 120;
	     int height = 30;
	     /*
	      * Image是一个抽象列,BufferedImage是Image的实现。
	      * Image和BufferedImage的主要作用就是将一副图片加载到内存中。
	     */
	     // 声明一个 RGB格式图片:图片类型为rgb
	     BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);
	     // 获取画笔
	     Graphics g = img.getGraphics();
	     // 背景色
	     g.setColor(Color.WHITE);
	     // 画
	     g.fillRect(0, 0, width, height);
	     // 字体
	     g.setFont(new Font("黑体", Font.BOLD, 18));
	     //为codeV传值 
	     String d ="";
	     // 写一个字符到img
	     Random r = new Random();
	     for (int i = 0; i < 4; i  ) {
	         //生成随机字母 
	         String chars = "ABCDEFGHJKMNOPQRSTUVWXYZ";
	         char codeEnglish = chars.charAt((int)(Math.random() * 24));
	         d  = codeEnglish;
	         codeV = d;
	         // 画笔随机色
	         g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
	         // 写出字符
	         g.drawString(""   codeEnglish, i * 30, 10   r.nextInt(20));   
	     }
	     //干扰线
	     for(int i=0;i<4;i  ){
	         g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
	         //画线
	         g.drawLine(r.nextInt(120), r.nextInt(30), r.nextInt(120), r.nextInt(30));
	     }
	     //图片生成
	     g.dispose();
	     //设置路径: 路径要用到转义\
//	     ImageIO.write(img,"JPEG", new FileOutputStream("H:\JiangYu\YanZhengImages\yanZhengImage.jpg"));
	     return img;
    }
}

2. 调用方法:

代码语言:javascript复制
/**
	 * 生成图形验证码
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	@RequestMapping(value="/getCode")
	public void getCode(HttpServletRequest request,HttpServletResponse response) throws Exception {
		
		ImageCreate i = new ImageCreate();
		//发送图片 
    	ImageIO.write(i.create(), "JPEG", response.getOutputStream());  
    	//验证码字符 
    	String code = i.getCode().toString();  
    	request.getSession().setAttribute("code", code);
	}

3. jsp 页面:

代码语言:javascript复制
 <div style="margin-bottom: 20px">
                <input id="code" name="code" type="text" class="easyui-textbox" style="width: 39%;
                    height: 40px; padding: 12px" data-options="prompt:'验证码',iconWidth:38" />
				<!-- 1.浮动提示框效果:easyui-tooltip、2.如果无法显示图像,浏览器将显示替代文本:alt属性 -->
                <a href="#" title="看不清,点击换一下" class="easyui-tooltip">
                    <img onclick="change()" class="easyui-linkbutton" src="/getCode" id="vimg" alt="" style="height: 40px;" /></a>
             </div>
代码语言:javascript复制
		//看不清,点击换一下
        function change() {
        	//图片对象
        	var imgNode = document.getElementById("vimg");
        	$.ajax({
        		url:"/getCode",
        		type:"post",
        		success:function(data){
        			//改变src属性值 
        			imgNode.src="/getCode?t="   (new Date()).valueOf();
        		},
        		error:function(){alert(" 验证码图片路径获取失败 !");}
        	});
        }

0 人点赞