-
CodeUtil.java
package com.kenai.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import java.util.Random; public class CodeUtil { private static final int width = 90; //定义图片的宽度 private static final int height = 20; //定义图片的高度 private static final int codeCount = 4; //定义图片上显示的验证码的个数 private static final int xx = 15; //验证码左侧x坐标起始位置 private static final int fontHeight = 18; // 字体大小 private static final int codeY = 16; //验证码左侧y坐标起始位置 private static final 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','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.BOLD:字体为粗体 Font font = new Font("Fixedsys", Font.BOLD, fontHeight); //设置字体 gd.setFont(font); //画边框 gd.setColor(Color.BLACK); gd.drawRect(0, 0, width - 1, height - 1); //随机产生40条干扰线,使图像中的认证码不易被其他程序探测到 gd.setColor(Color.BLACK); for(int i = 0; i < 30; 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); } //randomeCode用于保证随机产生的验证码,以便用户登陆后进行验证 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(36)]); //产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同 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); //存放验证码BuffedImage对象 map.put("codePic", buffImg); return map; } public static void main(String[] args) throws IOException { //创建文件输出流对象 OutputStream out = new FileOutputStream("/Users/zhaolijian/Desktop/miaoshaStable/" + System.currentTimeMillis() + ".jpg"); Map<String, Object> map = CodeUtil.generateCodeAndPic(); ImageIO.write((RenderedImage)map.get("codePic"), "jpeg", out); System.out.println("验证码的值为:" + map.get("code")); } }
-
调用代码
@GetMapping(value = "/generateverifycode") public void generateverifycode(HttpServletResponse response) throws BusinessException, IOException { Map<String, Object> map = CodeUtil.generateCodeAndPic(); redisTemplate.opsForValue().set("verify_code_" + userModel.getId(), map.get("code")); redisTemplate.expire("verify_code_" + userModel.getId(), 5, TimeUnit.MINUTES); ImageIO.write((RenderedImage)map.get("codePic"), "jpeg", response.getOutputStream()); }
-
前端界面
<body> <div class="content"> <div id = "verifyDiv" style="display: none" class="form-actions"> <img src=""/> <input type="text" id="verifyContent" value=""> <button class="btn blue" id="verifyButton" type="submit"> 验证 </button> </div> </div> </body> // jQuery(document).ready()这个方法在dom载入就绪时对其进行操纵并调用执行它所绑定的函数。 jQuery(document).ready(function(){ var token = window.localStorage["token"]; // 点击下单显示验证码,输入验证码点击验证提交生成令牌和下单请求 $("#createorder").on("click", function () { if(token == null){ alert("没有登陆,不能下单"); window.location.href="login.html"; return false; } $("#verifyDiv img").attr("src", "http://" + g_host + "/order/generateverifycode?token=" + token); $("#verifyDiv").show(); }); // 点击下单显示验证码,输入验证码点击验证提交生成令牌和下单请求 $("#verifyButton").on("click", function () { $.ajax({ type:"POST", contentType: "application/x-www-form-urlencoded", url:"http://" + g_host + "/order/generatetoken?token=" + token, data:{ "itemId":g_itemVO.id, "promoId":g_itemVO.promoId, "verifyCode":$("#verifyContent").val() }, xhrFields:{withCredentials:true}, success:function (data) { if(data.status == "success"){ var promoToken = data.data; $.ajax({ type:"POST", contentType: "application/x-www-form-urlencoded", url:"http://" + g_host + "/order/createorder?token=" + token, data:{ "itemId":g_itemVO.id, "promoId":g_itemVO.promoId, "amount":1, "promoToken":promoToken }, xhrFields:{withCredentials:true}, success:function (data) { if(data.status == "success"){ alert("下单成功"); window.location.reload(); }else{ alert("下单失败,原因为"+data.data.errMsg); if(data.data.errCode == 20003){ window.location.href="login.html"; } } }, error:function (data) { alert("下单失败,原因为"+data.responseText); } }); }else{ alert("获取令牌失败,原因为"+data.data.errMsg); if(data.data.errCode == 20003){ window.location.href="login.html"; } } }, error:function (data) { alert("获取令牌失败,原因为"+data.responseText); } }); }) initView(); });
图形验证码代码
猜你喜欢
转载自blog.csdn.net/qq_26496077/article/details/113704804
今日推荐
周排行