总体流程:
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; } }
相关推荐
FPGA之SSI接口协议实现 FPGA之SSI接口协议实现是指在 Field-Programmable Gate Array(现场可编程门阵列)中实现 Synchronous Serial Interface(同步串行接口)协议。SSI 是一种全双工的串行接口,允许芯片与多种...
在Java环境下,我们可以使用各种框架来实现SSI功能,以提高网站的开发效率和可维护性。下面我们将详细探讨Java中的SSI框架搭建及其应用。 首先,理解SSI的基本概念是必要的。SSI主要通过在HTML文件中使用特定的指令...
总的来说,这个项目展示了如何结合JavaCV和SSI框架来构建一个实用的图像检索系统,对于理解图像处理、特征提取和高效搜索索引的实现具有很好的学习价值。开发者可以从中学习到如何在Java环境下处理图像数据,如何...
基于FPGA的SSI通信控制器的设计和实现是通过使用VHDL硬件描述语言,基于Xilinx公司的FPGA设计平台,实现了一个可扩展的SoPC架构的通信控制器。 该控制器能够灵活地进行IP核模块扩展,并可作为外围处理机与TI公司TMS...
"ibatis_struts2"表示iBatis和Struts2的集成使用,"java_ssi"可能是指在Java环境下实现的SSI功能,"myeclipse_ssi"则表明在MyEclipse中进行了SSI相关的开发工作。这些标签为理解项目的技术栈提供了指导。 压缩包内...
《LabVIEW FPGA入门:实现串行同步接口(SSI)》 LabVIEW FPGA是NI(National Instruments)提供的一个强大的工具,允许用户使用图形化编程环境来设计和实现FPGA(Field Programmable Gate Array)应用程序。本篇...
在硬件设计中,采用Verilog语言实现SSI通信协议,这是一种硬件描述语言,用于描述数字系统的结构和行为。通过Verilog编程,可以创建出能够处理SSI协议的逻辑电路,实现编码器与主控系统的高效通信。 绝对值编码器与...
2. **Java中的SSI实现**:由于Java标准库不直接支持SSI,所以需要第三方库,例如`JSSIServlet`或者`SSIProcessor`等。这些库通常会提供一个Servlet,可以在HTTP请求处理链中拦截并处理包含SSI指令的页面。 3. **...
【标题】"java-ssi医疗系统"是一个基于Java技术栈的医疗信息系统,它采用Maven作为构建工具,结合Spring框架的三个核心组件——Spring、SpringMVC和Oracle数据库,为医疗机构提供了一整套功能完善的解决方案。...
在本教程中,我们将深入探讨如何实现SSI框架,并构建一个功能完善的动态网页系统。 1. **SSI基本语法** SSI的基本语法以`<!--#`开头,`-->`结尾,中间插入不同的指令。例如,`<!--#include virtual="header....
在本压缩包中,我们看到的是一个基于JAVA实现的SSI框架搭建实例。 【描述】:“JAVA SSI框架搭建的例子,字段很多,写的很全面,增删改查各种功能,ECLIPSE工具下。”这表明提供的压缩包内包含了一个完整的Java应用...
在本文中,我们将深入探讨如何实现简单的服务器端包含(SSI,Server Side Include)功能,同时结合XML和注解这两种技术。SSI是一种Web开发技术,它允许我们在HTML文档中嵌入服务器端的脚本或指令,从而动态生成网页...
在嵌入式系统开发中,STM32微控制器是一个广泛使用的平台,因其高效能和低功耗特性而受到...通过理解并实施这些步骤,开发者可以成功地从SSI编码器读取多圈绝对值数据,从而在各种工业应用中实现精确的位置检测和控制。
- `SSI范例`这个文件很可能包含了一个或多个HTML文件,这些文件使用了SSI指令来调用Java后端的Java方法或iBatis的XML配置文件,实现数据操作。 - 示例中可能还会包含Java Servlet或JSP文件,它们处理HTTP请求,...
SSI框架,即Struts2、Spring和iBatis的集成框架,是Java Web开发中常见的技术栈,用于构建高效、可维护的企业级应用程序。这个压缩包文件“ssi_curd”很可能包含了一个基本的CRUD(创建、读取、更新、删除)操作的...
标签中的"ssi_转_abz信号fpag程序"进一步强调了这是针对特定信号转换的FPGA程序,而"abz ssi_fpga"则表明这两个接口都在FPGA实现中得到了支持。 压缩包内的文件"SSI-ABZ"可能是设计文件、配置文件或者是编译后的....
在本项目中,我们关注的是如何使用Verilog硬件描述语言来实现一个11位编码器的SSI读取功能。Verilog是一种广泛应用于集成电路设计、验证的语言,能够描述数字系统的结构和行为。 首先,理解11位编码器的含义是关键...
SSI接口即同步串行接口具有传输速度快、连线简单、抗干扰能力强等优点,因而在光电编码器上得到了越来越广泛的应用,但其与计算机接口的连接实现较为复杂,在一定程度上影响了SSI接口光电编码器的推广和应用。...
SSI框架,即Struts2、Spring和Ibatis的集成,是一种常见的Java Web开发技术栈,用于构建高效、灵活的企业级应用程序。在这个项目中,我们将会深入探讨如何利用这些技术实现数据库的增删改查(CRUD)操作以及分页功能...
不过,随着Web技术的发展,SSI已经被更强大的服务器端脚本语言如PHP、ASP.NET、Java JSP等取代。这些语言提供了更丰富的功能和更好的可扩展性。尽管如此,理解SSI对于了解早期Web开发的历史和技术演进仍然具有重要...