- 随机数与验证码图片的生成
package com.zg.sxsh.serviceImpl; import com.zg.sxsh.service.IVerificationCodeImage; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; public class VerificationCodeImage implements IVerificationCodeImage { //ASCII 0-9 48-57 A-Z 65-90 a-z 97-122 static int[] asciis=codeASCII(); /** * 把数字与字母的ASCII码存入int[]中 * @return int[] */ static int[] codeASCII(){ int[] asciis=new int[62]; int ascii=48; for (int i=0;i<10;i++){ asciis[i]=ascii; ascii++; } ascii=65; for (int i=10;i<36;i++){ asciis[i]=ascii; ascii++; } ascii=97; for (int i=36;i<62;i++){ asciis[i]=ascii; ascii++; } return asciis; } /** * 生成一串字符串 * @param codeLength 字符串长度 * @param isNum 字符串是否有数字 * @param isABC 字符串是否有字母 * @return */ @Override public String randomVerificationCode(int codeLength, boolean isNum, boolean isABC) { String verificationCode=""; int index=0; for(int i=0;i<codeLength;i++){ if (isNum&isABC){ index=randomNum(0,62); } else if(isNum){ index=randomNum(0,10); } else if (isABC){ index=randomNum(10,62); } verificationCode+=String.valueOf((char) asciis[index]); } return verificationCode; } /** * 返回一个[minNum,maxNum)的随机数 * @param minNum 最小数 * @param maxNum 最大数 * @return 返回一个字符串 */ private int randomNum(int minNum,int maxNum){ Random random=new Random(); return random.nextInt(maxNum)+minNum; } private static final int IMAGE_WIDTH=100; private static final int IMAGE_HEIGHT=42; /** * 生成验证码图片缓存 * @param verificationCode 验证码字符串 * @return 图像缓存 */ @Override public BufferedImage createVerificationCodeImage(String verificationCode){ //定义图像buffer BufferedImage bufferedImage=new BufferedImage(IMAGE_WIDTH,IMAGE_HEIGHT,BufferedImage.TYPE_INT_RGB); Graphics graphics=bufferedImage.getGraphics(); Color color=Color.white; //设置画笔颜色 graphics.setColor(color); //设置图像形状和大小 graphics.fillRect(0,0,IMAGE_WIDTH,IMAGE_HEIGHT); //设置字体 Font font =new Font("微软雅黑",Font.BOLD,30); graphics.setFont(font); //设置画笔颜色 graphics.setColor(Color.black); //绘制文字 graphics.drawString(verificationCode,10,31); //Graphics转换成Graphics2D Graphics2D graphics2D=(Graphics2D)graphics; //设置画笔粗细 graphics2D.setStroke(new BasicStroke(2)); //设置八个点 Point[] points=new Point[8]; for (int i=0;i<4;i++){ points[i]=new Point(); points[i].x=1; points[i].y=randomNum(1,IMAGE_HEIGHT); } for (int i=4;i<8;i++){ points[i]=new Point(); points[i].x=IMAGE_WIDTH-1; points[i].y=randomNum(1,IMAGE_HEIGHT); } System.out.println(points); //根据生成的八个点,画4条干扰线 for (int i=0;i<4;i++){ graphics2D.drawLine(points[i].x,points[i].y,points[i+4].x,points[i+4].y); } return bufferedImage; } }
- 把图片缓存转成Stream
package com.zg.sxsh.action; import com.opensymphony.xwork2.ActionSupport; import com.zg.sxsh.serviceImpl.VerificationCodeImage; import org.apache.struts2.ServletActionContext; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class VerificationCodeAction extends ActionSupport { private ByteArrayInputStream inputStream; public ByteArrayInputStream getInputStream() { return inputStream; } /** * 把图片缓存转成Stream * @return * @throws Exception */ @Override public String execute() throws Exception { //实例化验证码图片生成类 VerificationCodeImage codeImage=new VerificationCodeImage(); //生成验证码 String code=codeImage.randomVerificationCode(4,true,true); //获取request HttpServletRequest request= ServletActionContext.getRequest(); //获取Session HttpSession session=request.getSession(); //把验证码存入session session.setAttribute("code",code); //获取图片缓存 BufferedImage image= codeImage.createVerificationCodeImage(code); // 创建输出流 ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); //把图片缓存写入输出流 ImageIO.write(image,"jpg",outputStream); //把图片输出流赋值给输入流 inputStream=new ByteArrayInputStream(outputStream.toByteArray()); //关闭输出/输入流 outputStream.close(); inputStream.close(); return SUCCESS; } }
- action中引用
<action name="verification_code" method="execute" class="com.zg.sxsh.action.VerificationCodeAction"> <result name="success" type="stream"> <param name="contentType">image/jpg</param> <param name="inputName">inputStream</param> </result> </action>
- jsp页面中调用
<img src="/verification_code" onClick="this.src='verification_code?timestamp='+Date.now()" alt="验证码">