package com.ws.frame.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; /**
* 随机验证码生成规则,用于页面防暴力破解
* @author YINGFU
*/
public class Captcha { public static final String SESSION_KEY = "CAPTCHA"; // session的属性名
private static final int WIDTH = 80; // 图片宽度
private static final int HEIGHT = 26; // 图片高度
private static final int LINESIZE = 8; // 图片干扰线数量
private static final int NUMBER = 4; // 产生字符数量
private static final int FONTSIZE = 18; // 图片文字大小
private static final int R = 255;
private static final int G = 255;
private static final int B = 255;
private static final int DEFAULT_FONT_STYLE = Font.CENTER_BASELINE; //默认样式
private static final String DEFAULT_FONT_FAMILY = Font.SANS_SERIF; //默认字体 /**
* 随机数产生池
*/
private static final char[] CHARSPOOL = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z' }; private Random random = new Random(); /**
* 生成随机字符
* @return string
*/
private char randomCode(){
int length = CHARSPOOL.length;
int num = random.nextInt(length);
return CHARSPOOL[num];
} /**
* 设置随机颜色的样式
* @return color
*/
private Color colorStyle(){
int r = random.nextInt(R);
int g = random.nextInt(G);
int b = random.nextInt(B);
return new Color(r, g, b);
} /**
* 设置字体的基本样式
* @return font
*/
private Font fontStyle(){
//为linux服务器使用
System.setProperty("java.awt.headless", "true");
return new Font(DEFAULT_FONT_FAMILY, DEFAULT_FONT_STYLE, FONTSIZE);
} /**
* 设置文字的颜色
* @return
*/
private Color fontColorStyle(){
int r = random.nextInt(100);
int g = random.nextInt(100);
int b = random.nextInt(100);
return new Color(r, g, b);
} /**
* 绘制随机数
* @param g
* @param i
* @return char
*/
private char drawRandomCode(Graphics g, int i){
g.setFont(fontStyle());
// g.setColor(colorStyle());
g.setColor(fontColorStyle());
char randomCode = randomCode();
g.translate(random.nextInt(3) , random.nextInt(3));
g.drawString(String.valueOf(randomCode), 13 * i, 16);
return randomCode;
} /**
* 绘制干扰线
* @param g
*/
private void drawLine(Graphics g){
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
int x2 = random.nextInt(WIDTH/2);
int y2 = random.nextInt(HEIGHT/2);
g.drawLine(x, y, x2, y2);
} /**
* 生成验证码
* @param session
* @param response
*/
public void buildCaptcha(HttpSession session, HttpServletResponse response){
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setFont(fontStyle());
g.setColor(colorStyle());
for(int i=0;i<LINESIZE;i++){
drawLine(g);
}
StringBuilder code = new StringBuilder();
for(int i=1; i<= NUMBER; i++){
code.append(drawRandomCode(g, i));
}
session.removeAttribute(SESSION_KEY);
session.setAttribute(SESSION_KEY, code.toString());
g.dispose();
try {
ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}

图片中 字体 和 绘制图线的颜色随机生成。

Java生成登陆时使用的图片验证码的更多相关文章

  1. 利用java生成带有干扰线的网页验证码图片

    package imageCreate; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import j ...

  2. java代码实现简单的认证——图片验证码形式

    前言:认证在互联网中会经常见到,其主要作用是安全问题中防止恶意破解.刷票等.在系统开发中认证的实现也有很多种,什么手机短信认证,邮箱认证等.在这里我使用最基本的验证码的形式进行认证,下面例出过程. 验 ...

  3. Atitit 图片 验证码生成attilax总结

    Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字  打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...

  4. Java生成名片式的二维码源码分享

    世界上25%的人都有拖延症——但我觉得这统计肯定少了,至少我就是一名拖延症患者.一直想把“Java生成名片式(带有背景图片.用户网络头像.用户昵称)的二维码”这篇博客分享出来,但一直拖啊拖,拖到现在, ...

  5. ASP.NET MVC 模块与组件(二)——定制图片验证码

     本着简洁直接,我们就直奔主题吧! 下面是一个生成数字和字母随机组合的验证码类源代码: using System; using System.Drawing; using System.Drawing ...

  6. java 生成简单word(利用Itext工具),生成简单Excel,以及下载笔记

    1.java 生成简单word(包含图片表格) pom中加入itext 相关依赖 <dependency> <groupId>com.lowagie</groupId&g ...

  7. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  8. 【Android】java生成炫酷验证码,不区分大小写。登陆,发送手机验证码,防止注册机,android开发

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下 ...

  9. 用Java制作一个简单的图片验证码

    //Java实现简单验证码功能 package project; import java.awt.Color; import java.awt.Font;import java.awt.Graphic ...

随机推荐

  1. UIwebView的html字符串高度计算

    ) { webView = [[UIWebView alloc]initWithFrame:CGRectMake(, , DEVW-, webviewH)]; webView.delegate = s ...

  2. jquery插件编写

    /*(function($) { $.fn.accordion = function(options) { var settings = $.extend({}, {open: false}, opt ...

  3. jquery之stop()的用法

    // 为了看效果,随意写的动画 $('#animater').animate({ 'right':-800 }, 3000).animate({'font-size':'16px'},'normal' ...

  4. js实现页面图片加载进度条

    //html <div id="loading" class="loading"> <div class="load"&g ...

  5. HDU ACM 题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

  6. oc语言--语法

    一.OC简介 1.简介 它是C语言的基础上,增加了一层面向对象语法 OC完全兼容C语言 可以在OC代码中混入C语言代码,甚至是C++代码 可以使用OC开发mac OS X平台和IOS平台的应用程序 2 ...

  7. php文件处理

    1. 将数据写入文件步骤 1. 打开这个文件,如果不存在,则新建文件 2. 将数据写入文件 3. 关闭文件 2. 从文件中读取数据步骤 1. 打开一个文件,如果不能打开,如文件不存在,应安全退出 2. ...

  8. linux下mysql连接jar包的位置在哪里?

    linux下连接mysql数据库,肯定也会用到驱动jar包. 该jar包应该被置于jdk安装路径下jre文件夹lib目录的ext文件夹下.例如我的JDK安装路径为/usr/java/jdk1.6.0_ ...

  9. 电子工程师名片——SPI NOR Flash

    使用了MX25L512的SPI接口的Flash 电路连接图: 总的大小512kb,即64kB,sector的大小为256 Bytes,block的大小为4k Bytes 调试时出现的问题: 1.Fla ...

  10. Match类

    Regex在匹配的时候,常常会返回一个Match类的对象,今天就来看看怎么玩这个对象. 一.属性 Captures 按从里到外.从左到右的顺序获取由捕获组匹配的所有捕获的集合(如果正则表达式用 Reg ...