效果图:
代码:
PictureCheckCode.java
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.tools.MD5;
public class PictureCheckCode extends HttpServlet{
private static final long serialVersionUID = 1L;
private Random rand=new Random();
/**
* 生成随机颜色
*
* @param start [int]
* @param end [int]
* @return Color [object]
*/
public Color getRandColor(int start,int end){
int randNum;
if(start>255) start=255;
if(end>255) end=255;
if(start>end) randNum=start-end;
else randNum=end-start;
int r=start+rand.nextInt(randNum);
int g=start+rand.nextInt(randNum);
int b=start+rand.nextInt(randNum);
return new Color(r,g,b);
}
/**
* 着色\旋转\缩放
*
* @param word 文字
* @param g 图片对象
*/
public void coloredAndRotation(String word,int i,Graphics g){
/**着色**/
g.setColor(new Color(20+rand.nextInt(110),20+rand.nextInt(110),20+rand.nextInt(110)));
/**旋转**/
Graphics2D g2d=(Graphics2D)g;
AffineTransform trans=new AffineTransform();
trans.rotate(rand.nextInt(45)*3.14/180,15*i+8,7);
/**缩放**/
float scaleSize=rand.nextFloat()+0.8f;
if(scaleSize>1f) scaleSize=1f;
trans.scale(scaleSize, scaleSize);
g2d.setTransform(trans);
g.drawString(word,15*i+20,20);
}
/**
* 生成100条干扰线
*
* @param g2d
* @param width
* @param height
*/
public void getRandLine(Graphics2D g2d,int width,int height){
for(int i=0;i<100;i++){
int x=rand.nextInt(width-1);
int y=rand.nextInt(height-1);
int z=rand.nextInt(6)+1;
int w=rand.nextInt(12)+1;
BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
Line2D line=new Line2D.Double(x,y,x+z,y+w);
g2d.setStroke(bs);
g2d.draw(line);
}
}
/**
* 获取随机文字
*
* @param length [int] 验证码长度
* @param g [Graphics] 图片对象
* @return String
* @case1:A-Z
* @case2:chinese
* @default:0-9
*/
@SuppressWarnings("unused")
public String getRandWord(int length,Graphics g){
String finalWord="",firstWord="";
int tempInt=0;
String[] array={
"0","1","2","3",
"4","5","6","7",
"8","9","a","b",
"c","d","e","f"};
for(int i=0;i<length;i++){
switch(rand.nextInt(2)){
case 1:
tempInt=rand.nextInt(26)+65;
firstWord=String.valueOf((char)tempInt);
break;
/*case 2:
int r1,r2,r3,r4;
String strH,strL;//high&low
r1=rand.nextInt(3)+11; //前闭后开[11,14)
if(r1==13){
r2=rand.nextInt(7);
}else{
r2=rand.nextInt(16);
}
r3=rand.nextInt(6)+10;
if(r3==10){
r4=rand.nextInt(15)+1;
}else if(r3==15){
r4=rand.nextInt(15);
}else{
r4=rand.nextInt(16);
}
strH=array[r1]+array[r2];
strL=array[r3]+array[r4];
byte[] bytes=new byte[2];
bytes[0]=(byte)(Integer.parseInt(strH,16));
bytes[1]=(byte)(Integer.parseInt(strL,16));
firstWord=new String(bytes);
break;*/
default:
tempInt=rand.nextInt(10)+48;
firstWord=String.valueOf((char)tempInt);
break;
}
finalWord+=firstWord;
this.coloredAndRotation(firstWord,i, g);
}
return finalWord;
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设制不缓存图片
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","No-cache");
response.setDateHeader("Expires",0);
//生成图片
response.setContentType("image/jpeg");
int width=100;
int height=40;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
Graphics2D g2d=(Graphics2D)g;
Font mFont=new Font("宋体",Font.BOLD,22);
g.setColor(this.getRandColor(200,250));
g.fillRect(0, 0, width, height);
g.setFont(mFont);
g.setColor(this.getRandColor(180,200));
this.getRandLine(g2d, width, height);
String randCode=this.getRandWord(4, g);
HttpSession session=request.getSession();
session.setAttribute("randCode",MD5.code(randCode.toLowerCase()));
g.dispose();
ImageIO.write(image,"JPEG",response.getOutputStream());
}
}
转载地址:http://www.dukai168.cn/blog/5.html
分享到:
相关推荐
70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java...
csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四种验证码生成集合。将生成的四个验证图片放在一个页面上以供比对,全部可以运行。 四种方法分别为: 1. 数字、字母、汉字混合验证码,叠影(给力)、扭曲 ...
这篇博客文章“java验证码生成类”提供了一个简单的示例,下面我们将深入探讨验证码生成的相关知识点。 首先,验证码的基本原理是生成一段随机的、难以由机器识别的文字或数字序列,然后要求用户在限定时间内输入这...
这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和实现。 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)的主要目标是区分...
Java验证码生成库 JCaptcha
"Java验证码生成"这个主题涵盖了如何在Java环境中创建这种安全功能。以下是对这个话题的详细解释: 验证码通常由一串随机字符组成,这些字符可能是数字、字母或者两者的组合,它们被设计成难以通过计算机程序自动...
Java生成算数运算中文图片验证码的实现,结合了编程语言、图像处理和安全验证的多种技术,为用户提供了一种既安全又友好的验证方式。下面我们将深入探讨这个主题。 首先,验证码的核心是生成随机的算数运算表达式。...
java验证码生成,数字+字母 史上最牛逼的验证码,很好用的,不信试试。
java后台生成背景色透明验证码的方法,可直接调用。本方法只生成随机字符数字组成的四位验证码。
该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。本源码包含了工具类源码及调用示例,可供开发者参考使用,集成到您的项目中。
Jcaptcha(Java 验证码生成框架)使用说明 一、框架概述 Jcaptcha 是一个 Java 验证码生成框架,提供了详细的说明及例程,通过调查实践后,总结的,希望对大家有帮助。该框架提供了生成验证码图像通用解决办法,...
用Java写了一个4位(可多位)验证码生成器,封装在一个类里,只需调用一个方法,写入生成图片的类型和生成图片路径,可直接生成验证码,并返回验证码信息。 最简单的使用方法:解压包后,进入captcha文件夹,双击...
一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片
在Java开发中,生成动态GIF验证码是一种常见的安全机制,用于防止自动机器人或者恶意脚本对网站进行非法操作。这种验证码通常包含随机生成的字母、数字或者符号,以动画的形式展示,用户需要输入看到的验证码才能...
总之,这个Java验证码生成工具是一个实用的开发资源,它可以帮助开发者快速构建自己的验证码系统,同时也能为研究验证码识别技术提供实验平台。通过学习和理解这个工具的实现原理,开发者可以深入理解验证码的安全...
随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。
本话题主要关注如何使用Java生成包含随机加减法问题的图形验证码。这种验证码不仅增加了安全性,还为用户提供了验证他们是否为人类的互动方式。 首先,`IdentifyingCode.java`可能是一个类,它代表验证码对象,包含...
JAVA源码Java验证码生成库JCaptcha
在Java开发中,生成验证码是一项基本技能。...通过学习和使用`kaptcha`或其他验证码生成库,开发者能够快速地在自己的项目中实现这一功能。同时,理解和实现验证码的生成也能加深对Java图形编程以及安全原理的理解。
checkcode(验证码) java验证码生成包