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);
}
}
java验证码汇总
最新推荐文章于 2020-08-03 12:41:49 发布