java.awt.Color;
java.awt.Font;
java.awt.;
java.awt.;
java.awt.;
java.awt.geom.;
java.awt.image.;
java.io.File;
java.io.;
java.io.;
java.io.;
java.util.;
java.util.;
javax..;
com..core.shiro.token..;
class {
//使用到字體java 驗證碼去干擾線java 驗證碼去干擾線,系統里沒有的話需要安裝字體,字體只顯示大寫,去掉了1,0,i,o幾個容易混淆的字符
final = "";
//驗證碼的Key
final = "_CODE";
= new ();
/**
* 驗證碼對象
*/
class {
code;//如 1 + 2
value;//如 3
() {
code;
}
void ( code) {
this.code = code;
}
() {
value;
}
void ( value) {
this.value = value;
}
}
/**
* 使用系統默認字符源生成驗證碼
* @param 驗證碼長度
* @
*/
(){
int = new ().(10) + 1;;
int = new ().(10) + 1;;
= new ();
.( + " x " + );
.( + );
;
}
/**
* 使用系統默認字符源生成驗證碼
* @param 驗證碼長度
* @
*/
(int ){
(, );
}
/**
* 清除驗證碼
*/
void (){
.().();
}
/**
* 對比驗證碼
*/
( code){
v = ().();
.(v, .(code));
}
/**
* 使用指定源生成驗證碼
* @param 驗證碼長度
* @param 驗證碼字符源
* @
*/
(int , ){
if( == null || .() == 0){
= ;
}
int = .();
rand = new (.());
= new ();
for(int i = 0; i < ; i++){
.(.(rand.(-1)));
}
.();
}
/**
* 生成隨機驗證碼文件,并返回驗證碼值
* @param w
* @param h
* @param
* @param
* @
* @
*/
(int w, int h, File , int ) {
= ();
(w, h, , );
;
}
/**
* 輸出隨機驗證碼圖片流,并返回驗證碼值
* @param w
* @param h
* @param os
* @param
* @
* @
*/
(int w, int h, os, int ) {
= ();
(w, h, os, );
;
}
/**
* 生成指定驗證碼圖像文件
* @param w
* @param h
* @param
* @param code
* @
*/
void (int w, int h, File , code) {
if( == null){
;
}
File dir = .();
if(!dir.()){
dir.();
}
try{
.();
fos = new ();
(w, h, fos, code);
fos.close();
} catch( e){
throw e;
}
}
/**
* 輸出指定驗證碼圖片流
* @param w
* @param h
* @param os
* @param code
* @
*/
void (int w, int h, os, code) {
int = code.();
image = new (w, h, .);
rand = new ();
g2 = image.();
g2.(.,.);
Color[] = new Color[5];
Color[] = new Color[] { Color.WHITE, Color.CYAN,
Color.GRAY, Color., Color., Color.,
Color.PINK, Color. };
float[] = new float[.];
for(int i = 0; i < .; i++){
[i] = [rand.(.)];
[i] = rand.();
}
.sort();
g2.(Color.GRAY);// 設置邊框色
g2.(0, 0, w, h);
Color c = (200, 250);
g2.(c);// 設置背景色
g2.(0, 2, w, h-4);
//繪制干擾線
= new ();
g2.((160, 200));// 設置線條的顏色
for (int i = 0; i < 20; i++) {
int x = .(w - 1);
int y = .(h - 1);
int xl = .(6) + 1;
int yl = .(12) + 1;
g2.(x, y, x + xl + 40, y + yl + 20);
}
// 添加噪點
float = 0.05f;// 噪聲率
int area = (int) ( * w * h);
for (int i = 0; i < area; i++) {
int x = .(w);
int y = .(h);
int rgb = ();
image.(x, y, rgb);
}
shear(g2, w, h, c);// 使圖片扭曲
g2.((100, 160));
int = h-4;
Font font = new Font("", Font., );
g2.(font);
char[] chars = code.();
for(int i = 0; i < ; i++){
= new ();
.(Math.PI / 4 * rand.() * (rand.() ? 1 : -1), (w / ) * i + /2, h/2);
g2.();
g2.(chars, i, 1, ((w-10) / ) * i + 5, h/2 + /2 - 10);
}
g2.();
.write(image, "jpg", os);
}
Color (int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + .(bc - fc);
int g = fc + .(bc - fc);
int b = fc + .(bc - fc);
new Color(r, g, b);
}
int () {
int[] rgb = ();
int color = 0;
for (int c : rgb) {
color = color > 1)
* Math.sin(() i / ()
+ (6. * () phase)
/ () );
g.(0, i, w1, 1, (int) d, 0);
if () {
g.(color);
g.((int) d, i, 0, i);
g.((int) d + w1, i, w1, i);
}
}
}
void ( g, int w1, int h1, Color color) {
int = .(40) + 10; // 50;
= true;
int = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
d = () ( >> 1)
* Math.sin(() i / ()
+ (6. * () phase)
/ () );
g.(i, 0, 1, h1, 0, (int) d);
if () {
g.(color);
g.(i, (int) d, i, 0);
g.(i, (int) d + h1, i, h1);
}
}
}
void main([] args) {
File dir = new File("F:/");
int w = 200, h = 80;
for(int i = 0; i < 50; i++){
= (4);
File file = new File(dir, + ".jpg");
(w, h, file, );
}
}
}
控制器調用工具類:
/**
* 獲取驗證碼
* @param
*/
@(value="",=.GET)
void ( , ){
try {
.("", "No-cache");
.("Cache-", "no-cache");
.("", 0);
.("image/jpg");
//生成隨機字串
= .(4);
//存入Shiro會話
.(., .());
//生成圖片
int w = 146, h = 33;
.(w, h, .(), );
} catch ( e) {
.((),e, "獲取驗證碼異常:%s",e.());
}
}
/**
* 獲取驗證碼(Gif版本)
* @param
*/
@(value="",=.GET)
void ( , ){
try {
.("", "No-cache");
.("Cache-", "no-cache");
.("", 0);
.("image/gif");
/**
* gif格式動畫驗證碼
* 寬,高,位數。
*/
= new (146,42,4);
//輸出
out = .();
.out(out);
out.flush();
//存入Shiro會話
.out.( .text().());
.(., .text().());
} catch ( e) {
.((),e, "獲取驗證碼異常:%s",e.());
}
}
/**
* 獲取驗證碼(jpg版本)
* @param
*/
@(value="",=.GET)
void ( , ){
try {
.("", "No-cache");
.("Cache-", "no-cache");
.("", 0);
.("image/jpg");
/**
* jgp格式驗證碼
* 寬,高,位數。
*/
= new (146,33,4);
//輸出
.out(.());
= .(true);
//存入
.("_code",.text().());
} catch ( e) {
.((),e, "獲取驗證碼異常:%s",e.());
}
}