总体流程:
html页面发送生成验证码请求,java服务端生成对应的验证吗并回写到页面,点击验证码或者刷新页面及页面报错情况下,验证码都要刷新。
html端:
<img id="imageCode" alt="验证码" src="image_getImgCode.do" style="margin-left:20px;height:36px;cursor: pointer;" /> $(function(){ //为图片绑定单击事件 $('#imageCode').click(function(){ //设置src属性为action的参数为当前时间,保证验证码点击之后可以变换 $(this).attr('src', 'image_getImgCode.do?dt=' + new Date().getTime()); }); });
struts.xml:
<action name="image_*" class="imageDemoAction" method="{1}"></action>
spring配置文件:
<bean id="imageDemoAction" class="com.infohold.businessyun.action.ImageDemoAction" scope="prototype"> </bean>
action:
public class ImageDemoAction extends ActionSupport{ private static final long serialVersionUID = 1L; private Logger logger = Logger.getLogger(ImageDemoAction.class); //stream result只能输出InputStream类型 private InputStream imageStream; public InputStream getImageStream() { return imageStream; } public void setImageStream(InputStream imageStream) { this.imageStream = imageStream; } public void getImgCode() throws IOException{ HttpServletResponse response = ServletActionContext.getResponse(); HttpServletRequest request = ServletActionContext.getRequest(); //生成验证码 Map<String, BufferedImage> map = ImageUtil.createImage(); String key = map.keySet().iterator().next(); HttpSession session = request.getSession(); session.removeAttribute("key"); session.setAttribute("key", key); BufferedImage image = map.get(key); try{ imageStream = ImageUtil.getInputStream(image); OutputStream outputStream = response.getOutputStream(); ImageIO.write(image, "jpeg", outputStream); outputStream.close(); }catch(IOException e){ logger.error("生成验证码失败:"+e.getMessage()); e.printStackTrace(); } } }
工具类:
/** * 简单验证码生成工具 * ImageUtil, 用于生成验证码 * createImage方法返回一个Map类型,Map 的key是所生产的验证码的字符串, * Map的value是所生产的BufferImage类型的验证码; * getInputStream方法将 BufferImage转成InputStream类型; * @author jiqing */ public class ImageUtil { private static final char[] chars = {'0','1','2','3','4','5','6','7','8','9', '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'}; private static final int SIZE = 4; //字符数 private static final int LINES = 12; //干扰线数量 private static final int WIDTH = 130; //生成的验证码图片的宽度 private static final int HEIGHT = 60; //生成的验证码图片的长度 private static final int FONT_SIZE = 40; //字体大小 public static Map<String, BufferedImage> createImage(){ //用户保存字符串 StringBuffer sb = new StringBuffer(); //BufferImage类型的验证码 BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); //获得画笔 Graphics g = image.getGraphics(); g.setColor(Color.LIGHT_GRAY); //设置背景色 g.fillRect(0, 0, WIDTH, HEIGHT);//将背景色填充到图片中 Random ran = new Random(); //获得一个Random对象 //画字符 for(int i=1; i<=SIZE; i++){ int r = ran.nextInt(chars.length); //得到一个随机的下标, chars 是保存着若干字符的char字符 g.setColor(getRandomColor()); //得到一个随机的颜色 g.setFont(new Font(null, Font.BOLD+Font.ITALIC, FONT_SIZE)); //设置字体大小 g.drawString(chars[r]+"", (i-1)*WIDTH/SIZE, (int)(HEIGHT*0.7)); //画字符 sb.append(chars[r]); } //画干扰线 for(int i=1; i<=LINES; i++){ g.setColor(getRandomColor()); //同样,干扰线也是用随机的颜色 g.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran.nextInt(WIDTH), ran.nextInt(HEIGHT));//随机设置干扰线的方向 } //将图片中的字符串保存为Map对象的key,BufferedImage保存为value Map<String, BufferedImage> map = new HashMap<String, BufferedImage>(); map.put(sb.toString(), image); return map; } /** * 获得一个随机的颜色 返回 Color对象 * @return */ private static Color getRandomColor() { Random ran = new Random(); Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256)); return color; } /** * 将 BufferImage转成InputStream类型 * @param image * @return * @throws IOException */ public static InputStream getInputStream(BufferedImage image) throws IOException{ ByteArrayOutputStream bos = new ByteArrayOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); encoder.encode(image); byte[] imageBts = bos.toByteArray(); InputStream in = new ByteArrayInputStream(imageBts); return in; } }
相关推荐
在这个项目中,DWR可能用于实现验证码的动态生成和验证,以及用户登录时的即时反馈,提供更好的用户体验。 5. **增删改查(CRUD)**:这是数据库操作的基本动作,包括创建(Create)、读取(Read)、更新(Update)...
2. **多属性传递**:可以通过Java的集合类如Map来实现。 3. **数组幂集**:利用递归或位运算生成所有可能的子集组合。 4. **最大子串**:字符串处理,可以使用滑动窗口或动态规划方法。 5. **JDBC模板模式**:封装...
少儿编程scratch项目源代码文件案例素材-纸人伙计.zip
scratch少儿编程逻辑思维游戏源码-忍者罗伊 V5.zip
scratch少儿编程逻辑思维游戏源码-跑和枪.zip
前端开发_基于jQuery和EasyUI框架_企业级Web应用UI组件库与后台管理系统模板_提供GPL开源版本和商业授权版本的双重授权模式_适用于快速构建响应式管理后台和复杂数据可
少儿编程scratch项目源代码文件案例素材-纸格通关 云变量.zip
微信机器人开发_Wechaty框架_百度云主机部署_自然语言处理_消息自动化处理_多媒体文件管理_聊天记录持久化_表情包导出_语音视频自动保存_文件管理系统集成_跨平台数据同步_个
少儿编程scratch项目源代码文件案例素材-钻机机器人.zip
少儿编程scratch项目源代码文件案例素材-作战基地.zip
云计算_微服务分布式架构SpringCloudSpringBootDubboVuejs_互联网云快速开发框架敏捷开发系统代码生成工作流CMS图表统计地图统计_免费开源JAVA企业
scratch少儿编程逻辑思维游戏源码-日落塔.zip
Tobapuww_GPT-Recovery-Files_12888_1745866661386
少儿编程scratch项目源代码文件案例素材-战斗竞技场.zip
scratch少儿编程逻辑思维游戏源码-球球大作战.zip
聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发,安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD,TB等业务定制,子账号业务逻辑API 非常详细,方便内置对接! IP白名单 业务逻辑 支持IP白名单,黑名单,全局白名单,全局黑名单,保障系统的安全。 接口验签名 采用支付宝RSA加密接口方式,防止篡改数据,导致对账困难,资金大量损失,无故少钱 对接灵活 全部对接参数灵活操作 风控完善 轮询、交易金额、随机金额、最大金额、最小金额等 测试环境: Nginx+PHP7.0+MySQL5.6 网站运行目录:/public 伪静态设置为:thinkphp规则 数据库信息修改路径:/application/database.php
校园社交服务_微信小程序云开发_公告资讯失物招领二手交易兼职招聘表白墙_为高校师生提供一站式校园生活服务平台包含校园动态通知课程表查询失物发布与认领二手物品交易平台兼职信息发布与求
yinghuayu2377_myFTPDemo_32152_1745866651913
scratch少儿编程逻辑思维游戏源码-魔法球.zip
idea导入个人风格