Java后台生成验证码图片
来源:互联网 发布:手机上编写c语言的软件 编辑:程序博客网 时间:2024/06/05 09:29
用法,在后台生成验证码图片,将图片内容存入用户session,通过用户输入校验输入内容与session中的验证码比对进行比较。
1.工具类
package com.caissa.paygateway.common.util;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;/** * 生成验证码工具类 * @author wanghuan04 */public class CodeUtil { private static int width = 90;// 定义图片的width private static int height = 20;// 定义图片的height private static int codeCount = 4;// 定义图片上显示验证码的个数 private static int xx = 15; private static int fontHeight = 18; private static int codeY = 16; 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', '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); // Graphics2D gd = buffImg.createGraphics(); // Graphics2D gd = (Graphics2D) buffImg.getGraphics(); 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); // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。 gd.setColor(Color.BLACK); for (int i = 0; i < 15; 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;// 设置三原色 int green = 0;// 设置三原色 int 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.setColor(new Color(red)); 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")); }}2.生成验证码和校验验证码的action
package com.caissa.paygateway.web.action.consume;import java.awt.image.RenderedImage;import java.io.IOException;import java.util.Map;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.caissa.paygateway.common.util.CodeUtil;import com.caissa.paygateway.web.action.BaseAction;@Controller@RequestMapping("/yzm_code")public class YZMConsumeAction extends BaseAction {/** * 日志 */private static final Logger log = LoggerFactory.getLogger(YZMConsumeAction.class);/** * 前台请求得到验证码 * * @param request * @param response * @throws Exception */@RequestMapping("/getCode")public void getCode(HttpServletRequest request, HttpServletResponse response) throws Exception {// 调用工具类生成的验证码和验证码图片 Map<String, Object> codeMap = CodeUtil.generateCodeAndPic(); // 将四位数字的验证码保存到Session中。 HttpSession session = request.getSession(); session.setAttribute("yzm_code", codeMap.get("code").toString()); // 禁止图像缓存。 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", -1); response.setContentType("image/jpeg"); // 将图像输出到Servlet输出流中。 ServletOutputStream sos; try { sos = response.getOutputStream(); ImageIO.write((RenderedImage) codeMap.get("codePic"), "jpeg", sos); sos.close(); log.info("生成二维码成功:code:"+codeMap.get("code").toString()); } catch (IOException e) { log.info("生成验证码失败"); e.printStackTrace(); } }/** * 后台请求验证验证码是否正确 * * @param request * @param response * @throws Exception */@RequestMapping("/checkCode")public void checkCode(HttpServletRequest request, HttpServletResponse response) throws Exception {String code_request = request.getParameter("yzm_code_request"); // 验证验证码 String sessionYZMCode = request.getSession().getAttribute("yzm_code").toString(); if (code_request != null && !"".equals(code_request) && sessionYZMCode != null && !"".equals(sessionYZMCode)) { if (code_request.equalsIgnoreCase(sessionYZMCode)) { response.getWriter().println("1"); } else { response.getWriter().println("0"); } } else { response.getWriter().println("0"); } }}
3.校验验证码的js
/** * 验证码控制JS */var Yzm_Code = {/** * 创建验证码 */createCode : function(){var imgSrc = $("#yzm_code"); var src = imgSrc.attr("src"); imgSrc.attr("src", Yzm_Code.changeYzmUrl(src));},/** * 更新时间搓,切换图片 * @returns {返回验证内容} */changeYzmUrl : function(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;},/** * 检查验证码输入是否正确 * @return flag 验证成功或失败 */checkYZMCode : function(){var flag = false;var cardyzm = $("#cardyzm").val();$.ajax({url: "yzm_code/checkCode.do",data:{yzm_code_request : cardyzm,},async: false,dataType: "json", success: function (data) { if(data=='1'){ $('.yzm_box .notes').html(""); flag = true; }else{ $('.yzm_box .notes').html("* 验证码错误,请重新输入!"); } }});return flag;},}// 验证码标签光标消失事件 $('.yzm_box').focusout(function() { var cardyzm = $('input[name="cardyzm"]').val(); if(!$.trim(cardyzm)){ $('.yzm_box .notes').text("* 请输入验证码"); }else{ // 验证验证码 var checkYZMCodeFlag = Yzm_Code.checkYZMCode(); if(!checkYZMCodeFlag){ Yzm_Code.createCode(); } } });4.页面展示标签
<ul><li class="yzm_box"><p class="top_inp"><input type="text" placeholder="请输入图片中的字符 " id="cardyzm" name="cardyzm" /><img id="yzm_code" class="nocode" alt="验证码" src="yzm_code/getCode.do"></p><p class="notes"></p></li></ul>
阅读全文
0 0
- Java后台生成验证码图片
- Java生成图片验证码
- Java生成验证码图片
- Java生成图片验证码
- Java生成图片验证码
- JAVA 生成验证码图片
- Java生成图片验证码
- Java生成验证码图片
- java生成验证码图片
- java生成验证码图片
- java 生成图片验证码
- java生成图片验证码
- java验证码图片生成
- JAVA生成图片验证码
- JAVA生成图片验证码
- java--生成图片验证码
- java生成图片验证码
- Java生成图片验证码
- Android中事件传递机制的总结
- 第十五周项目1
- 《芳华》
- ZEBRA打印汉字的实现
- win10远程桌面连接Ubuntu 16.04图形界面
- Java后台生成验证码图片
- ionic build android 中解决下载慢的资源
- git提交代码
- Ubuntu16安装chrome
- 《极客与团队》【PDF】下载
- 数据结构总结之最小生成树
- maven+Spring+SpringMVC+Mybatis+MySQL+tomcat环境搭建
- 关于SD卡的路径在4.0和5.0、6.0不同的问题
- Yii视图添加资源文件在所有资源文件的下面