Struts2生成验证码小例子
众所周知,验证码在互联网中应用非常之广泛,作用也很明确,防止机器人。下面我将详细讲解如何利用struts2来生成验证码:
step1:ImageUtil.java
工具类,生产指定大小的图片
package image; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.util.Random; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class ImageUtil { public static byte[] getInstance(int width,int height,int num,String number) throws Exception{ byte[] codeArr = null; /* * 一,绘图 */ //step1,内存映像对象(画布) BufferedImage image = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); //step2,获得画笔 Graphics g = image.getGraphics(); //step3,给画笔设置颜色 Random r = new Random(); g.setColor(new Color(r.nextInt(255), r.nextInt(255),r.nextInt(255))); //step4,给画布设置背景颜色 g.fillRect(0, 0, width, height); //step5,重新给笔设置颜色 g.setColor(new Color(255,255,255)); g.setFont(new Font(null,Font.ITALIC,height-height/5)); //step6,将验证码转换成图片 g.drawString(number, width/10, height-height/5); //step7,加一些干扰线 for(int i = 0; i < 8; i ++){ g.setColor(new Color(r.nextInt(255), r.nextInt(255),r.nextInt(255))); g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height)); } /* * 二,压缩图片并输出 */ //1.字节数组输出流,向字节数组中输出信息 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //2.压缩图片 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); //图片中的二进制信息输出到内存中 encoder.encode(image); codeArr = baos.toByteArray(); return codeArr; } //获取随机数 public static String getNumber(int num) { String number = ""; String chars = "0123456789"; Random r = new Random(); for(int i = 0; i < num; i ++){ number += chars.charAt( r.nextInt(chars.length())); } return number; } }
step2:VerifyAction.java
生成验证码Action,将生成的验证码的字节数组连接到InputStream流上,传给VS,以便jsp页面使用
package image; import java.io.ByteArrayInputStream; import java.io.InputStream; public class VerifyAction { public InputStream inputStream; public InputStream getInputStream() { return inputStream; } public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } public String execute() throws Exception{ String number = ImageUtil.getNumber(4); try { byte[] arr = ImageUtil.getInstance(100, 30,4, number); inputStream = new ByteArrayInputStream(arr); } catch (Exception e) { e.printStackTrace(); throw e; } return "success"; } }
struts.xml文件
<package name="image" namespace="/image" extends="struts-default"> <!--stream类型负责输出二进制信息 --> <action name="img" class="image.VerifyAction"> <result name="success" type="stream"> <!-- inputName是一个OGNL表达式,该表达式可以从VS中获取相应的属性值 --> <!-- StreamResult就是从InputStream对象中读取输入流 --> <param name="inputName">inputStream</param> </result> </action> </package>