JAVA生成验证码
<img border="0"
src="ValidateCode"
id='code' width="64" height="30"
style="vertical-align: top; cursor: pointer;"
title="点击刷新验证码" />
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; public class ValidateCode 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=80;
int height=30;
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",randCode);
g.dispose();
ImageIO.write(image,"JPEG",response.getOutputStream());
}
}
JAVA生成验证码的更多相关文章
- 【开发技术】Java生成验证码
Java生成验证码 为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下; ...
- Java生成验证码原理(jsp)
验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...
- Java生成验证码(二)
前一篇博客已经介绍了如何用Java servlet产生验证码,本篇继续介绍如何使用一些开源组件生成验证码 ———————————————————————————————————————————— ...
- Java生成验证码并进行验证(转)
本文转自http://blog.csdn.net/worm0527/article/details/51030864 一.实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用 ...
- Java生成验证码_转
为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下;这是一个web工程, ...
- java生成验证码结合springMVC
在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...
- java生成验证码并可刷新
手心创建一个简单的页面来显示所创建的验证码 <body> <form action="loginName.mvc" method="post" ...
- Java 生成验证码图片
生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...
- JAVA生成验证码代码
生成base64格式图片验证码 /** * 验证码的候选内容 */ private char codeSequence[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', ...
- Java生成验证码小工具
无意中看到一个生成简易验证码的小工具类(保存学习): 工具类代码: import java.awt.BasicStroke; import java.awt.Color; import java.aw ...
随机推荐
- codeforces A. Cinema Line 解题报告
题目链接:http://codeforces.com/problemset/problem/349/A 题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这 ...
- HDU 2.1.7 (求定积分公式)
The area Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- PO/VO/BO等对象模型
PO :persistent object持久对象 1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录. 2 .在hibernate持久化框架中与i ...
- 在Spring3中,配置DataSource的方法有6种。
第一种:beans.xml Xml代码 收藏代码<bean id="dataSource" class="org.apache.commons.dbcp.Basic ...
- CSS3 background-size 属性值:cover
当设置值为cover,可以呈现出图片铺满浏览器内容的视觉效果 实例 规定背景图像的尺寸: div { background:url(img_flwr.gif); background-size:80p ...
- Python中通过cx_oracle操作ORACLE数据库的封闭函数
哈哈,看来我的SQL自动化发布,马上就全面支持ORACLE,MYSQL,POSTGRESQL,MSSQL啦... http://blog.csdn.net/swiftshow/article/deta ...
- mac安装nginx
1,http://nginx.org/en/download.html下载http://nginx.org/download/nginx-1.2.0.tar.gz 2,tar -xf nginx-1. ...
- [杂] 一些常用的SQL归类之一
整理了一大坨的常用SQL语句,以方便自己需要用的时候查找. 查看锁 SELECT [request_session_id] , c.[program_name] , DB_NAME(c.[dbid]) ...
- androidSDK也要配置环境变量(转)
android的开发人员来说,首先要做的就是环境变量的配置.java是需要配置环境变量的.当然,安卓的环境变量需要我们配置adb的使用,将开发平台的两个工具包配置到环境变量里. 工具/原料 andro ...
- HDU 4348 To the moon 可持久化线段树
To the moon Problem Description BackgroundTo The Moon is a independent game released in November 201 ...