JavaWeb驗證碼代碼

1)產生驗證碼的類,該類返回一個流

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import com.opensymphony.xwork2.ActionContext;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.zkyc.action.user.BaseAction;

public class ImageUtil extends BaseAction{   //BaseAction爲自定義的一個類該類得到request、response
//application 等對象

 private InputStream inn;
 public String execute(){
  byte[] b=null;
  ByteArrayOutputStream os = new ByteArrayOutputStream();
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
  Map<String, BufferedImage> map=getImage();
  String code=(String)session.get("code");
  BufferedImage image=map.get(code);
  try {
   encoder.encode(image);
  } catch (ImageFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  b=os.toByteArray();
  inn= new ByteArrayInputStream(b);
  return "ok";
 }
 private static final String[] chars = { "0", "1", "2", "3", "4", "5", "6",
   "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I"};
 private static final int SIZE = 4;
 private static final int LINES = 20;
 private static final int WIDTH = 200;
 private static final int HEIGHT = 100;
 private static final int FONT_SIZE = 50;

 public static Map<String, BufferedImage> getImage() {
  StringBuffer sb = new StringBuffer();
  BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
    BufferedImage.TYPE_INT_RGB);

  Graphics graphic = image.getGraphics();
  graphic.setColor(Color.LIGHT_GRAY);
  graphic.fillRect(0, 0, WIDTH, HEIGHT);
  Random ran = new Random();

  //   
  for (int i = 1; i <= SIZE; i++) {
   int r = ran.nextInt(chars.length);
   graphic.setColor(getRandomColor());
   graphic.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE));
   graphic.drawString(chars[r], (i - 1) * WIDTH / SIZE, HEIGHT / 2);
   sb.append(chars[r]);//
  }
  ActionContext.getContext().getSession().put("code", sb.toString());
  
  
  //
  for (int i = 1; i <= LINES; i++) {
   graphic.setColor(getRandomColor());
   graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran
     .nextInt(WIDTH), ran.nextInt(HEIGHT));
  }
  Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
  map.put(sb.toString(), image);
  return map;
 }

 private static Color getRandomColor() {
  Random ran = new Random();
  Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran
    .nextInt(256));
  return color;
 }

 public InputStream getInn() {
  return inn;
 }

 public void setInn(InputStream inn) {
  this.inn = inn;
 }

 
}

 

 2)配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>
     <package name="user" extends="dangd-default" namespace="/user">         
      <!-- 產生驗證碼 --> 

      <!-- inn爲產生驗證碼的類返回的流的名字 --> 

     <action name="code" class="com.zkyc.util.ImageUtil">       
        <result name="ok" type="stream">
         <param name="inputName">inn</param>
        </result>
        </action>
     </package>
    </struts>

 

3)jsp頁面上的配置

<img class="yzm_img" id='imgVcode' src="code.action"   <!-- code與配置文件中Action的name屬性對應相等 --> 
        width="100px" />

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章