总体流程:
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开发.pdf
maven项目,基于spring3+springmvc+oracle的医疗项目
fpga ssi之间的通信,使用fpga完成ssi的设计
近年来,随着科技和工业的快速发展,...详细阐述了SSI协议的通信方式,设计出硬件电路,并采用Verilog语言实现了SSI通信协议。通过测试实验,证明了该应用系统抗干扰性强、性能可靠、通信速度快,具有潜在的市场价值。
Java开发的简单ssi框架,适用于初学者
主流框架SSI的搭建以及实现过程,你值的拥有!
ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子ssi例子
SSI接口即同步串行接口具有传输速度快、连线简单、抗干扰能力强等优点,因而在光电编码器上得到了越来越广泛的应用,但其与计算机接口的连接实现较为复杂,在一定程度上影响了SSI接口光电编码器的推广和应用。...
使用Verilog 编程语言实现对11 bit 编码器SSI输出的读取
这是我的毕业设计,里面包含代码和所有毕业论文的文档。0分亲情奉献,希望对大家有帮助
本资料包括以下内容: SSI配置,指令描述,SSI支持的变量,应用示例
SSI框架 实现登陆以及 增删改查 LZLL第三部
芯片STM32F103VET6,定时器模拟SPI读取SSI多圈绝对值编码器的值
SSI library, Logic gates verilog codes
用于将SSI协议转换成RS232协议,因为带SSI协议处理能力的单片机几乎没有
struts2+spring+ibatis做的小程序
刚学完ssi时候 做的一个会员注册登录的效果,是一个初级开发者很好的参考资料。
ssi-uploader是一款带预览图并且可以拖拽文件的jQuery ajax文件上传插件。该文件上传插件支持AJAX,支持多文件上传,可控制上的文件格式和文件大小,提供各种回调函数,使用非常方便。提供java后台代码。
很不错的代码,希望大家能够学习愉快,有所斩获
strut2 spring ibatis三大框架整合