JavaWeb验证码代码

来源:互联网 发布:37轩辕剑神器进阶数据 编辑:程序博客网 时间:2024/05/18 02:14

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" />

0 0
原创粉丝点击