JAVA生成验证吗jsp接收配合strut2实现

来源:互联网 发布:鲁班土建预算软件 编辑:程序博客网 时间:2024/04/30 22:41

java画图类:


    package com.form.comm.util;            import java.awt.Color;      import java.awt.Font;      import java.awt.Graphics2D;      import java.awt.image.BufferedImage;      import java.io.FileOutputStream;      import java.io.IOException;      import java.io.OutputStream;      import java.util.Random;            import javax.imageio.ImageIO;      /**      * 验证码生成器      * @author dsna      *      */      public class ValidateCode {          // 图片的宽度。          private int width = 160;          // 图片的高度。          private int height = 40;          // 验证码字符个数          private int codeCount = 5;          // 验证码干扰线数          private int lineCount = 150;          // 验证码          private String code = null;          // 验证码图片Buffer          private BufferedImage buffImg=null;                private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',                  'K', 'L', 'M', 'N',  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',                  'X', 'Y', 'Z',  '1', '2', '3', '4', '5', '6', '7', '8', '9' };                public  ValidateCode() {              this.createCode();          }                /**          *           * @param width 图片宽          * @param height 图片高          */          public  ValidateCode(int width,int height) {              this.width=width;              this.height=height;              this.createCode();          }          /**          *           * @param width 图片宽          * @param height 图片高          * @param codeCount 字符个数          * @param lineCount 干扰线条数          */          public  ValidateCode(int width,int height,int codeCount,int lineCount) {              this.width=width;              this.height=height;              this.codeCount=codeCount;              this.lineCount=lineCount;              this.createCode();          }                    public void createCode() {              int x = 0,fontHeight=0,codeY=0;              int red = 0, green = 0, blue = 0;                            x = width / (codeCount +2);//每个字符的宽度              fontHeight = height - 2;//字体的高度              codeY = height - 4;                            // 图像buffer              buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);              Graphics2D g = buffImg.createGraphics();              // 生成随机数              Random random = new Random();              // 将图像填充为白色              g.setColor(Color.WHITE);              g.fillRect(0, 0, width, height);              // 创建字体              ImgFontByte imgFont=new ImgFontByte();              Font font =imgFont.getFont(fontHeight);              g.setFont(font);                            for (int i = 0; i < lineCount; i++) {                  int xs = random.nextInt(width);                  int ys = random.nextInt(height);                  int xe = xs+random.nextInt(width/8);                  int ye = ys+random.nextInt(height/8);                  red = random.nextInt(255);                  green = random.nextInt(255);                  blue = random.nextInt(255);                  g.setColor(new Color(red, green, blue));                  g.drawLine(xs, ys, xe, ye);              }                            // randomCode记录随机产生的验证码              StringBuffer randomCode = new StringBuffer();              // 随机产生codeCount个字符的验证码。              for (int i = 0; i < codeCount; i++) {                  String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);                  // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。                  red = random.nextInt(255);                  green = random.nextInt(255);                  blue = random.nextInt(255);                  g.setColor(new Color(red, green, blue));                  g.drawString(strRand, (i + 1) * x, codeY);                  // 将产生的四个随机数组合在一起。                  randomCode.append(strRand);              }              // 将四位数字的验证码保存到Session中。              code=randomCode.toString();               }                    public void write(String path) throws IOException {              OutputStream sos = new FileOutputStream(path);                  this.write(sos);          }                    public void write(OutputStream sos) throws IOException {                  ImageIO.write(buffImg, "png", sos);                  sos.close();          }          public BufferedImage getBuffImg() {              return buffImg;          }                    public String getCode() {              return code;          }      }  




ImgFontByte 类


package com.form.comm.util;import java.io.ByteArrayInputStream;  import java.awt.*;  /**  * ttf字体文件  * @author dsna  *  */  public class ImgFontByte {      public Font getFont(int fontHeight){          try {              Font baseFont = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(hex2byte(getFontByteStr())));              return baseFont.deriveFont(Font.PLAIN, fontHeight);          } catch (Exception e) {              return new Font("Arial",Font.PLAIN, fontHeight);          }      }            private  byte[] hex2byte(String str) {           if (str == null)              return null;          str = str.trim();          int len = str.length();          if (len == 0 || len % 2 == 1)              return null;            byte[] b = new byte[len / 2];          try {              for (int i = 0; i < str.length(); i += 2) {                  b[i / 2] = (byte) Integer                          .decode("0x" + str.substring(i, i + 2)).intValue();              }              return b;          } catch (Exception e) {              return null;          }      } /**   * ttf字体文件的十六进制字符串   * @return   */   private String getFontByteStr(){  return null;        //  return str;//字符串太长 在附件中找  }  }  

struts配置文件


   <action name="download_code" class="pAction" method="DownLoad_code">            <result name="DownLoad_code" type="chain">download</result>        </action>

action方法


public void DownLoad_code() throws Exception {HttpServletRequest request = ServletActionContext.getRequest();String path = request.getParameter("path");try {// 设置响应的类型格式为图片格式          response.setContentType("image/jpeg");          //禁止图像缓存。          response.setHeader("Pragma", "no-cache");          response.setHeader("Cache-Control", "no-cache");          response.setDateHeader("Expires", 0);                    HttpSession session = request.getSession();                    ValidateCode vCode = new ValidateCode(120,40,5,100);          session.setAttribute("code", vCode.getCode());          vCode.write(response.getOutputStream());  }catch (Exception e) {e.printStackTrace();}} 

jsp页面 :

<div class="download-btn"><div style="font-family: arial; margin-left: 14px">File Type: <span class="info">    PDF</span><br />Pages    :    <span class="info">254Pages </span><br /> Size       : <span class="info">    2M</span><br /></div><form action="#"><input type="text" id="input1" style="width:90px;margin-bottom:20px"/>  <img src="<%=path%>/download_code" alt="验证码" id="authCode" onclick="changeImg()">           <a href="#" onclick="changeImg()">看不清,换一张!</a>   </form><a class="down"  onclick="validate('${ pdf_url }');"  href="javascript:void(0)">DOWNLOAD</a></div></div></div></div>  <div style="clear:both"></div><!-- single-wrap --></div><!-- single-container --><%@ include file="common/footer.jsp"%> <script type="text/javascript">      function changeImg(){               $("#authCode").attr("src","<%=path%>/download_code?d="+new Date().valueOf());           }          </script> 



截图效果:


纠结好久总算解决了

睡觉了大笑


0 0
原创粉丝点击