通过servlet 实现图片验证码功能

 通过servlet 实现图片验证码功能,分3步实现:

import javax.servlet.http.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletException;
import javax.servlet.ServletOutputStream;
import java.io.Exception;
import java.util.Randow;
import java.awt.Color;
import java.awt.Image.BufferImage;
import java.awt.Graphics2D;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;

/**
 通过servlet实现验证码功能
*/
public class CodeServlet extends HttpServlet{

//声明字符数组常量,随机数从此常量中获取(去除了些常见的容易产生歧义的字符如'1','l','0','o'等)
publis static final char[] CHARS= {'2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','g','k','m','n','p','q','r','s','t','u','v','w','x','z'}

public static Randow randow = new Randow();//声明随机数

//获取4位的随机数
public static String getRandow(){
  StringBuffer buffer= new StringBuffer();
  for(int i=0; i<4; i++){
    buffer.append(CHARS[randow.nextInt(CHARS.length())]);
  }
  return buffer.toString();
} 

//获取随机颜色
public static Color getColor(){
  return new Color(radow.nextInt(255),radow.nextInt(255),radow.nextInt(255));
}

//获取随机颜色反色
public static Color getReverseColor(Color c){
  return new Color(255-c.getRed(), 255-c.getGreen(), 255-c.getBlue());
}

public void doGet(HttpServletRequst request, HttpServletResponse response) throws HttpServletException,IOException{
  //设置相应类型,此处相应类型为图片,HTML文本为(text/html)
  response.setContentType("image/jpeg");
  //request.setCharacterEncoding = "UTF-8"; //设置请求的编码格式
 //response.setCharacterEncoding = "UTF-8"; //设置响应的编码格式
  String rdmString  = getRandom();
  //设置Session以便与前台输入的随机数对比
  request.getSession().setAttribute("rdmString",rdmString);
  int width = 50;
  int height = 20;
  Color clr = getColor();
  Color rclr = getReverseColor(clr);

  //创建图片对象,绘制图片,设置图片属性,产生噪点(最多50个),对图片对象编码
  BufferImage bi = new BufferImage(width, height, BufferImage.TYPE_INT_RGB);
  Graphics2D g = bi.createGraphics();
 g.setFont(new Font(FONT.SANS_SERFS,FONT.BOLD,12));
  g.setColor(clr);
  g.fillRect(0,0,width,height);
  g.setColor(rclr);
  g.drawString(rdmString,10,10);
  for(int i=0,n=random.nextInt(50); i<n; n++,i++){
   g.drawRect(width,height,1,1);  
 }
  
  ServletOutputStream out = response.getOutputStream();
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  encoder.encode(bi);//对图片对象编码
  out.flush();
}
} 
<servlet>
<servlet-name>codeServlet</servlet-name>
<servlet-class>com.servlet.CodeServlet</servlet-class><!-- 实际的类路径 -->
</servlet>

<servlet-mapping>
<servlet-name>codeServlet</servlet-name>
<url-pattern>/servlet/codeServlet</url-pattern>
</servlet-mapping> 
<script>
fucntion loadIMG(){
  document.getElementById('btn1').disabled = true;
  document.getElementById('img1').src = "servlet/codeServlet?ts='+new Date().getTime+'";
}
</script>
<img id="img1" src="servlet/codeServlet" οnlοad="btn1.disabled = false;">
<input type="button" id="btn1" value="换一张" οnclick="loadIMG()">

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值