java生成随机图片验证码和验证

先来看一下效果:

下面来看一下代码吧!

页面部分:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息管理——登录</title>
<script type="text/javascript" src="static/js/jquery-1.12.4.min.js"></script>
<style type="text/css">
	body{
		background: url(static/img/login.png) no-repeat;
		background-size: cover;
	}
	#home{
		width: 20%;
		height: 30%;
		margin-left: 63%;
		margin-top: 17%;
		color: #479b9b;
	}
	.inp{
		width: 98%;
		line-height: 40px;
		margin: 10px 0;
		font-size: 20px;
		border: none;
		background: #293f54;
		border: 2px solid #13c9a3;
		border-radius: 30px;
	}
	#username, #passwrod{
		text-indent: 1.5em;
	}
	#username{
		background: url(static/img/username.png) no-repeat left;
	}
	#passwrod{
		background: url(static/img/password.png) no-repeat left;
	}
	#btn{
		background: #22c1a1;
	}
	#yzm{
		width: 45%;
		text-indent: 1em;
	}
	#btn:hover{
		cursor: pointer;
		background: #33FF99;
		color: white;
	}
	#img{
	    float: right;
	    margin: 10px;
	}
	#img:hover {
		cursor: pointer;
	}
</style>
</head>
<body>
	<div id="home">
		<form id="myForm" action="login" method="post">
			<input type="text" value="aaa" class="inp" name = "username" id="username" />
			<input type="password" value="1234" class="inp" name = "password" id="passwrod" />
			
			<input type="text" class="inp" id="yzm" placeholder="验证码" />
			<img id="img" src="getCode" onclick="changeImg()">
			
			<div style="margin: 10px;">
				<span><input type="checkbox" id="aaa"><label for="aaa">记住我</label></span>
				<span style="float: right;">注册</span>
			</div>
			
			<button type="button" class="inp" id="btn">立即登录</button>
		</form>
	</div>
	
	<script type="text/javascript">
		//点击更换验证码
	    function changeImg() {
	        var imgSrc = $("#img");    
	        var src = imgSrc.attr("src");        
	        imgSrc.attr("src", chgUrl(src));
	    }
	    
	    // 时间戳
	    // 为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳
	    function chgUrl(url) {
	        var timestamp = (new Date()).valueOf();
	        url = url.substring(0, 20);
	        if ((url.indexOf("&") >= 0)) {
	            url = url + "×tamp=" + timestamp;
	        } else {
	            url = url + "?timestamp=" + timestamp;
	        }
	        return url;
	    }
	    
	    //登录
	    $("#btn").click(function(){
	    	var yzm = $("#yzm").val();
	    	var username = $("#username").val();
	    	var passwrod = $("#passwrod").val();
	    	$.post("yz", {yzm: yzm}, function(data){
	    		if(data.success){
	    			$("#myForm").submit();
	    		}else{
	    			alert("验证码输入错误!")
	    		}
	    	})
	    })
	    //监听回车事件
	    $('#myForm').bind('keyup', function(event) {
	        if (event.keyCode == "13") {
	            $('#btn').click();
	        }
	    });
	    
	</script>
</body>
</html>

生成验证码和验证码图片的工具类CodeUtil.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.imageio.ImageIO;

public class CodeUtil {
    private static int width = 120;// 定义图片的width
    private static int height = 45;// 定义图片的height
    private static int codeCount = 4;// 定义图片上显示验证码的个数
    private static int xx = 22;
    private static int fontHeight = 35;
    private static  int codeY =35;
    private static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
            'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    
    /**
     * 生成一个map集合
     * code为生成的验证码
     * codePic为生成的验证码BufferedImage对象
     * @return
     */
    public static Map<String,Object> generateCodeAndPic() {
        // 定义图像buffer
        BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics gd = buffImg.getGraphics();
        // 创建一个随机数生成器类
        Random random = new Random();
        // 将图像填充为白色
        gd.setColor(Color.WHITE);
        gd.fillRect(0, 0, width, height);

        // 创建字体,字体的大小应该根据图片的高度来定。
        Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
        // 设置字体。
        gd.setFont(font);

        // 画边框。
        gd.setColor(Color.BLACK);
        gd.drawRect(0, 0, width - 1, height - 1);

        // 随机产生50条干扰线,使图象中的认证码不易被其它程序探测到。
        gd.setColor(Color.BLACK);
        for (int i = 0; i < 50; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            gd.drawLine(x, y, x + xl, y + yl);
        }

        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
        StringBuffer randomCode = new StringBuffer();
        int red = 0, green = 0, blue = 0;

        // 随机产生codeCount数字的验证码。
        for (int i = 0; i < codeCount; i++) {
            // 得到随机产生的验证码数字。
            String code = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
            red = random.nextInt(255);
            green = random.nextInt(255);
            blue = random.nextInt(255);

            // 用随机产生的颜色将验证码绘制到图像中。
            gd.setColor(new Color(red, green, blue));
            gd.drawString(code, (i + 1) * xx, codeY);

            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        Map<String,Object> map  =new HashMap<String,Object>();
        //存放验证码
        map.put("code", randomCode);
        //存放生成的验证码BufferedImage对象
        map.put("codePic", buffImg);
        return map;
    }

    //测试
    public static void main(String[] args) throws Exception {
        //创建文件输出流对象
        OutputStream out = new FileOutputStream("D://img/"+System.currentTimeMillis()+".jpg");
        Map<String,Object> map = CodeUtil.generateCodeAndPic();
        ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);
        System.out.println("验证码的值为:"+map.get("code"));
	}

}

后台生成验证和效验代码

/**
 * 生成验证码
 * @param req
 * @param resp
 */
@RequestMapping(value="/getCode")
@ResponseBody
public void getCode(HttpServletRequest req, HttpServletResponse resp) {
	 // 调用工具类生成的验证码和验证码图片
    Map<String, Object> codeMap = CodeUtil.generateCodeAndPic();

    // 将四位数字的验证码保存到Session中。
    HttpSession session = req.getSession();
    session.setAttribute("code", codeMap.get("code").toString());

    // 禁止图像缓存。
    resp.setHeader("Pragma", "no-cache");
    resp.setHeader("Cache-Control", "no-cache");
    resp.setDateHeader("Expires", -1);

    resp.setContentType("image/jpeg");

    // 将图像输出到Servlet输出流中。
    ServletOutputStream sos;
    try {
        sos = resp.getOutputStream();
        ImageIO.write((RenderedImage) codeMap.get("codePic"), "jpeg", sos);
        sos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 验证验证输入是否正确
 * @param yzm
 * @param request
 * @return
 */
@RequestMapping(value="/yz")
@ResponseBody
public Object yz(String yzm, HttpServletRequest request) {
	//字符串全部转为小写
	yzm = yzm.toLowerCase();
	String yzm1 = request.getSession().getAttribute("code").toString().toLowerCase();
	if(yzm.equals(yzm1)) {
		return new AjaxResult("ok");
	}else {
		return new AjaxResult(false, "no");
	}
}

 

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java 图片滑动验证码的示例代码,使用 Java Swing 库实现: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class ImageSliderVerificationCode extends JFrame { private static final long serialVersionUID = 1L; private final int WIDTH = 400; private final int HEIGHT = 300; private final int BLOCK_SIZE = 50; private Image bgImage; private Image blockImage; private int blockX; private int blockY; private int mouseX; private int mouseY; private boolean isDragging; public ImageSliderVerificationCode() { setTitle("Image Slider Verification Code"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); bgImage = new ImageIcon("background.jpg").getImage(); blockImage = new ImageIcon("block.png").getImage(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.getX() >= blockX && e.getX() <= blockX + BLOCK_SIZE && e.getY() >= blockY && e.getY() <= blockY + BLOCK_SIZE) { isDragging = true; mouseX = e.getX(); mouseY = e.getY(); } } public void mouseReleased(MouseEvent e) { isDragging = false; if (blockX >= WIDTH - BLOCK_SIZE) { JOptionPane.showMessageDialog(null, "Verification passed!"); System.exit(0); } else { blockX = 0; blockY = new Random().nextInt(HEIGHT - BLOCK_SIZE); repaint(); } } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { if (isDragging) { blockX += e.getX() - mouseX; blockY += e.getY() - mouseY; if (blockX < 0) { blockX = 0; } if (blockX > WIDTH - BLOCK_SIZE) { blockX = WIDTH - BLOCK_SIZE; } if (blockY < 0) { blockY = 0; } if (blockY > HEIGHT - BLOCK_SIZE) { blockY = HEIGHT - BLOCK_SIZE; } mouseX = e.getX(); mouseY = e.getY(); repaint(); } } }); } public void paint(Graphics g) { g.drawImage(bgImage, 0, 0, null); g.drawImage(blockImage, blockX, blockY, null); } public static void main(String[] args) { ImageSliderVerificationCode verCode = new ImageSliderVerificationCode(); verCode.setVisible(true); } } ``` 此代码将生成一个包含背景图片和滑块图片的窗口。当用户按住滑块图片并拖动它时,窗口将显示移动后的滑块图片。如果用户将滑块图片拖动到窗口的右边缘,则显示验证通过的消息并退出程序。否则,滑块图片将被重置到窗口的左侧,并随机在窗口的垂直方向上移动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值