java验证码汇总

1.生成gif图片格式的
package com.cssweb.common.util;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
/*
* 功能:调用AuthServlet可以生成一个验证码图片,图片的宽度和高度可以自定义
* 调用格式: /servlet/AuthServlet?width=60&height=20
*      或者/servlet/AuthServlet
* 时间:2007-9-4
*  
*
*/
public class AuthServlet extends HttpServlet {
private static final long serialVersionUID = 8433932715396048208L;
private Font mFont=new Font("Times New Roman", Font.PLAIN,18);//设置字体
// 处理post
public void doPost(HttpServletRequest request,HttpServletResponse response)
  throws ServletException,IOException {
  doGet(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
      throws ServletException,IOException {
  // 取得一个1000-9999的随机数
  HttpSession session=request.getSession();//request.getSession(false)当参数为false时,有可能不创建session
  response.setContentType("image/gif");
  response.setHeader("Pragma","No-cache");
  response.setHeader("Cache-Control","no-cache");
  response.setDateHeader("Expires", 0);
  int width=60;
  int height=20;
  if(request.getParameter("width")!=null && !request.getParameter("width").equals(""))
   width = Integer.parseInt(request.getParameter("width"));
  if(request.getParameter("height")!=null && !request.getParameter("height").equals(""))
   height = Integer.parseInt(request.getParameter("height"));
                
     ServletOutputStream out=response.getOutputStream();
     BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //设置图片大小的
     Graphics gra=image.getGraphics();
     Random random=new Random();

     gra.setColor(getRandColor(200,250)); //设置背景色
     gra.fillRect(0,0,width,height);

     gra.setColor(Color.black); //设置字体色
     gra.setFont(mFont);
     // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
     gra.setColor(getRandColor(160,200));
     for (int i=0;i<155;i++) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            gra.drawLine(x,y,x+xl,y+yl);
     }
     // 取随机产生的认证码(4位数字)
     String sRand="";
     for (int i=0;i<4;i++) {
      String rand=String.valueOf(random.nextInt(10));
      sRand+=rand;
      // 将认证码显示到图象中
      gra.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
      gra.drawString(rand,13*i+6,16);
     }
        //System.out.println("showimage="+sRand);
        //session.setAttribute("getImg",sRand);
        session.setAttribute("vnum",sRand);
        //AuthCode = sRand;
        //session.putValue("AuthCode",sRand);
        JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
        encoder.encode(image);
        //out.flush();
}
static Color getRandColor(int fc,int bc){//给定范围获得随机颜色
  Random random = new Random();
  if(fc>255) fc=255;
       if(bc>255) bc=255;
       int r=fc+random.nextInt(bc-fc);
       int g=fc+random.nextInt(bc-fc);
       int b=fc+random.nextInt(bc-fc);
       return new Color(r,g,b);
}
  
static public String getAuthCode(HttpSession session){//返回验证
  return (String)session.getAttribute("AuthCode");      
}
}

=====================================================================================

2.生成png格式的图片

/*
* @(#)version 1.0 Feb 25, 2009
* @author hujun
* CodeMakerServlet.java
* Copyright 2008 CSS WEB Microsystems, Inc. All rights reserved.
* CSS WEB ROOM PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.cssweb.common.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class CodeMakerServlet extends HttpServlet {
private static final long serialVersionUID = 8226534304924504314L;
private Random random = new Random(new Date().getTime());
/*
private Font[] codeFont =
    {
        new Font("Algerian", Font.BOLD, 65),
        new Font("Vivaldi", Font.BOLD, 85),
        new Font("Broadway", Font.BOLD, 60),
        new Font("Forte", Font.BOLD, 75)
    };
private Color[] color =
{
        Color.BLACK, Color.RED, Color.DARK_GRAY, Color.BLUE
};
*/
String codeNumbers = "";
//int width = 250, height = 70;
int width=80, height=25;
public CodeMakerServlet() {
  super();
}
public void destroy() {
  super.destroy();
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
  // 清空缓冲区
  response.reset();
  // 注意这里的MIME类型
  response.setContentType("image/png");
  // 设置页面不缓存
  response.setHeader("Pragma", "No-cache");
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expires", 0);
  // 创建一个 250X70 的图像
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  // 得到图形环境对象 g
  Graphics g = image.getGraphics();
  // 填充背景
  g.setColor(getRandColor(240,255));
  g.fillRect(0, 0, width, height);
  for (int i = 0; i<4; i++) {
   drawCode(g, i);
  }
  drawNoise(g, 100);
  // 绘制边框
  g.setColor(Color.black);
  //g.setColor(getRandColor(160,200));
  g.drawRect(0, 0, width - 1, height - 1);
  // 将验证码内容保存进session中
  HttpSession session = request.getSession();
  session.setAttribute("vnum", codeNumbers);
  
  // 重设字符串
  codeNumbers = "";
  // 利用ImageIO类的write方法对图像进行编码
  ServletOutputStream sos = response.getOutputStream();
  ImageIO.write(image, "PNG", sos);
  sos.close();
}

// 绘制验证码
public void drawCode(Graphics graphics, int i)
{
  int number = (int)(Math.random() * 10);
  graphics.setFont(new Font("Times New Roman",Font.PLAIN,24));
  graphics.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
  //graphics.setFont(codeFont);
  //graphics.setColor(color);
  graphics.drawString("" + number, 15*i+4, 18);
  codeNumbers += number;
}

// 绘制干扰线
public void drawNoise(Graphics graphics, int lineNumber)
{
  graphics.setColor(getRandColor(160,200));
  for (int i = 0; i<lineNumber; i++) {
         int x = random.nextInt(width);
         int y = random.nextInt(height);
         int xl = random.nextInt(12);
         int yl = random.nextInt(12);
         graphics.drawLine(x,y,x+xl,y+yl);
  }
}

// 处理 HTTP post 请求, 和doGet一样
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
  doGet(request, response);
}

Color getRandColor(int fc,int bc){
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值