// checkCodeServlet.java
package cn.jishupeng.bookstore.web.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 验证码生成程序
*
*/
@WebServlet("/imageCode")
public class CheckImgServlet extends HttpServlet {
// 集合中保存所有成语
private List words = new ArrayList();
@Override
public void init() throws ServletException {
// 初始化阶段,读取new_words.txt
// web工程中读取 文件,必须使用绝对磁盘路径
String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
words.add(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 禁止缓存
// response.setHeader("Cache-Control", "no-cache");
// response.setHeader("Pragma", "no-cache");
// response.setDateHeader("Expires", -1);
int width = 120;
int height = 30;
// 步骤一 绘制一张内存中图片
BufferedImage bufferedImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 步骤二 图片绘制背景颜色 ---通过绘图对象
Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
// 绘制任何图形之前 都必须指定一个颜色
graphics.setColor(getRandColor(200, 250));
graphics.fillRect(0, 0, width, height);
// 步骤三 绘制边框
graphics.setColor(Color.WHITE);
graphics.drawRect(0, 0, width - 1, height - 1);
// 步骤四 四个随机数字
Graphics2D graphics2d = (Graphics2D) graphics;
// 设置输出字体
graphics2d.setFont(new Font("宋体", Font.BOLD, 18));
Random random = new Random();// 生成随机数
int index = random.nextInt(words.size());
String word = words.get(index);// 获得成语
// 定义x坐标
int x = 10;
for (int i = 0; i < word.length(); i++) {
// 随机颜色
graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110)));
// 旋转 -30 --- 30度
int jiaodu = random.nextInt(60) - 30;
// 换算弧度
double theta = jiaodu * Math.PI / 180;
// 获得字母数字
char c = word.charAt(i);
// 将c 输出到图片
graphics2d.rotate(theta, x, 20);
graphics2d.drawString(String.valueOf(c), x, 20);
graphics2d.rotate(-theta, x, 20);
x += 30;
}
// 将验证码内容保存session
request.getSession().setAttribute("checkcode_session", word);
// 步骤五 绘制干扰线
graphics.setColor(getRandColor(160, 200));
int x1;
int x2;
int y1;
int y2;
for (int i = 0; i < 30; i++) {
x1 = random.nextInt(width);
x2 = random.nextInt(12);
y1 = random.nextInt(height);
y2 = random.nextInt(12);
graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
}
// 将上面图片输出到浏览器 ImageIO
graphics.dispose();// 释放资源
ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/**
* 取其某一范围的color
*
* @param fc
* int 范围参数1
* @param bc
* int 范围参数2
* @return Color
*/
private 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);
}
}
new_words.txt文件(放在WEB-INF文件夹下, 避免被外部直接访问)
这个文件的成语可以自己添加, 验证码每次从中随机一个成语返回给前台
一唱一和
一呼百应
一干二净
一举两得
一落千丈
一模一样
一暴十寒
一日千里
一五一十
一心一意
两面三刀
三长两短
三番五次
三三两两
三头六臂
三心二意
三言两语
四分五裂
四面八方
四通八达
四平八稳
五光十色
五湖四海
五花八门
五颜六色
六神无主
七颠八倒
七零八落
七拼八凑
七上八下
七手八脚
七嘴八舌
八面玲珑
九死一生
十全十美
百发百中
百孔千疮
百战百胜
百依百顺
千变万化
千差万别
千军万马
千山万水
千丝万缕
千辛万苦
千言万语
千真万确
千锤百炼
千方百计
千奇百怪
千姿百态
千钧一发
千虑一得
千虑一失
千篇一律
万水千山
万无一失
万众一心
万紫千红
万死一生
推心置腹
肝胆相照
情同手足
志同道合
风雨同舟
荣辱与共
同甘共苦
关怀备注
心心相印
海誓山盟
拔刀相助
亲密无间
万紫千红
春暖花开
鸟语花香
姹紫嫣红
花红柳绿
百花争艳
锦上添花
火树银花
昨日黄花
春花秋月
过时黄花
花团锦簇
花枝招展
崇山峻岭
山明水秀
山穷水尽
大好山河
刀山火海
地动山摇
高山深涧
悬崖峭壁
峰峦雄伟
漫山遍野
江山如画
锦绣山河
五彩缤纷
五颜六色
一碧千里
万紫千红
花红柳绿
翠色欲流
姹紫嫣红
五光十色
青红皂白
绿水青山
不可多得
凤毛麟角
九牛一毛
绝无仅有
空前绝后
寥寥无几
寥若晨星
宁缺毋滥
前所未有
屈指可数
三三两两
铁树开花
微乎其微
一麟半爪
一丝一毫
百里挑一
沧海一粟
千古绝唱
摩肩接踵
车水马龙
川流不息
纷至沓来
花花世界
举袖为云
挥汗如雨
络绎不绝
门庭若市
万人空巷
水泄不通
人声鼎沸
人欢马叫
人山人海
震耳欲聋
座无虚席
包罗万象
琳琅满目
美不胜收
目不暇接
无奇不有
无穷无尽
无所不包
五花八门
眼花缭乱
洋洋大观
一应俱全
应有尽有
应接不暇
比比皆是
不可计数
层出不穷
绰绰有余
多多益善
多如牛毛
俯拾皆市
举不胜举
漫山遍野
星罗棋布
丰富多彩
九霄云外
腾云驾雾
壮志凌云
风云变幻
风起云涌
行云流水
风卷残云
浮云蔽日
孤云野鹤
烘云托月
过眼云烟
烟消云散
大雨倾盆
血雨腥风
风雨交加
风调雨顺
枪林弹雨
风雨同舟
风雨无阻
和风细雨
狂风暴雨
满城风雨
滂沱大雨
春风化雨
风雨飘摇
斜风细雨
未雨绸缪
水流湍急
水平如镜
高山流水
千山万水
水滴石穿
水乳交融
滴水不漏
杯水车薪
洪水猛兽
流水无情
直言不讳
无所顾忌
拐弯抹角
真心诚意
故弄玄虚
侃侃而谈
滔滔不绝
虚情假意
推心置腹
旁敲侧击
喋喋不休
慢条斯理
含糊其词
唠唠叨叨
振振有辞
肆无忌惮
大言不惭
娓娓动听
绘声绘色
对答如流
自圆其说
闲言碎语
闭月羞花
沉鱼落雁
出水芙蓉
明眸皓齿
美如冠玉
倾国倾城
国色天香
鹤发童颜
眉清目秀
和蔼可亲
心慈面善
张牙舞爪
愁眉苦脸
冰清玉洁
雍容华贵
文质彬彬
威风凛凛
老态龙钟
虎背熊腰
如花似玉
容光焕发
落落大方
骨瘦如柴
大腹便便
面黄肌瘦
其貌不扬
蓬头垢面
弱不禁风
口若悬河
对答如流
滔滔不绝
谈笑风生
高谈阔论
豪言壮语
夸夸其谈
花言巧语
忐忑不安
心惊肉跳
心神不定
心猿意马
心慌意乱
七上八下
心急如焚
班门弄斧
孤芳自赏
居功自傲
目中无人
妄自尊大
忘乎所以
惟我独尊
自高自大
自鸣得意
自我陶醉
自命不凡
目空一切
不骄不躁
功成不居
戒骄戒躁
洗耳恭听
虚怀若谷
慎言谨行
学无止境
学而不厌
真才实学
学而不倦
发奋图强
废寝忘食
争分夺秒
孜孜不倦
笨鸟先飞
闻鸡起舞
自强不息
只争朝夕
不甘示弱
全力以赴
力争上游
披荆斩棘
奋不顾身
舍己为人
坚强不屈
赤胆忠心
不屈不挠
忠贞不渝
誓死不二
威武不屈
舍死忘生
肝胆相照
克己奉公
一丝不苟
两袖清风
见礼忘义
永垂不朽
顶天立地
豁达大度
兢兢业业
卖国求荣
恬不知耻
贪生怕死
厚颜无耻
神采奕奕
眉飞色舞
昂首挺胸
惊慌失措
漫不经心
垂头丧气
没精打采
愁眉苦脸
大惊失色
炯炯有神
怒发冲冠
一目十行
一日千里
一字千金
百发百中
一日三秋
不毛之地
不计其数
胆大包天
寸步难行
一步登天
千钧一发
观者如云
挥金如土
铁证如山
爱财如命
稳如泰山
门庭若市
骨瘦如柴
冷若冰霜
如雷贯耳
守口如瓶
浩如烟海
高手如林
阳春三月
春光明媚
春回大地
春暖花开
春意盎然
春意正浓
风和日丽
春花烂漫
鸟语花香
百鸟鸣春
百花齐放
莺歌燕舞
赤日炎炎
烈日炎炎
骄阳似火
挥汗如雨
大汗淋漓
鸟语蝉鸣
万木葱茏
枝繁叶茂
莲叶满池
秋高气爽
天高云淡
秋风送爽
秋菊怒放
秋菊傲骨
秋色迷人
秋色宜人
金桂飘香
果实累累
北雁南飞
满山红叶
五谷丰登
芦花飘扬
天寒地冻
北风呼啸
滴水成冰
寒冬腊月
瑞雪纷飞
冰天雪地
冰封雪盖
漫天飞雪
白雪皑皑
冰封大地
冰天雪地
东方欲晓
旭日东升
万物初醒
空气清醒
雄鸡报晓
晨雾弥漫
晨光绚丽
烈日当头
丽日临空
艳阳高照
万里无云
碧空如洗
日落西山
夕阳西斜
残阳如血
炊烟四起
百鸟归林
华灯初上
夜幕低垂
日薄西山
夜深人静
月明星稀
夜色柔美
夜色迷人
深更半夜
漫漫长夜
风光秀丽
人山人海
车水马龙
宁静和谐
草木苍翠
竹篱瓦舍
山幽路辟
小桥流水
直指青云
古色古香
青砖素瓦
耸入碧云
机器轰鸣
铁流直泻
热气腾腾
钢花飞溅
粉饰一新
门可罗雀
冷冷清清
错落有致
富丽堂皇
设施齐全
气势雄伟
金碧辉煌
风景如画
闻名遐迩
井然有序
杂乱无章
布局巧妙
错落有致
宽阔平坦
崎岖不平
拥挤不堪
畅通无阻
花红柳绿
花色迷人
花香醉人
花枝招展
百花齐放
百花盛开
百花争艳
绚丽多彩
五彩缤纷
姹紫嫣红
绿草如茵
一碧千里
杂草丛生
生机勃勃
苍翠挺拔
郁郁葱葱
枯木逢春
秀丽多姿
青翠欲滴
林海雪原
耸入云天
瓜果蔬菜
清香鲜嫩
青翠欲滴
果园飘香
果实累累
果实饱满
鲜嫩水灵
象征和平
乳燕初飞
婉转悦耳
莺歌燕舞
翩然归来
枝头嬉戏
灰不溜秋
叽叽喳喳
鹦鹉学舌
婉转悦耳
笨嘴学舌
利嘴如铁
钢爪如钉
神气活现
昂首挺胸
肥大丰满
自由自在
引吭高歌
腾空而起
狂奔飞驰
膘肥体壮
昂首嘶鸣
瘦骨嶙峋
行动迟缓
俯首帖耳
膘肥体壮
川流不息
呼啸而过
穿梭往来
缓缓驶离
一叶扁舟
扬帆远航
乘风破浪
雾海夜航
追波逐浪
划破云层
直冲云霄
穿云而过
银鹰展翅
学习用品
美观实用
小巧玲珑
造型优美
设计独特
栩栩如生
活泼可爱
惹人喜爱
爱不释手
雨后彩虹
彩桥横空
若隐若现
光芒万丈
大雪纷飞
大雪封山
鹅毛大雪
漫天飞雪
瑞雪纷飞
林海雪原
风雪交加
雪上加霜
寒霜袭人
霜林尽染
垂露欲滴
朝露晶莹
日出露干
电光石火
雷电大作
惊天动地
春雷滚滚
电劈石击
雷电交加
阴雨连绵
牛毛细雨
秋雨连绵
随风飘洒
倾盆大雨
狂风暴雨
大雨滂沱
瓢泼大雨
大雨淋漓
暴雨如注
秋风送爽
金风送爽
北风呼啸
微风习习
寒风刺骨
风和日丽
大雾迷途
云雾茫茫
雾似轻纱
风吹雾散
云消雾散
彩云满天
天高云淡
乌云翻滚
彤云密布
彩霞缤纷
晚霞如火
朝霞灿烂
丹霞似锦
满天星斗
众星捧月
群星灿烂
万点繁星
月出东墙
月出东山
玉兔东升
月光皎洁
月色迷人
月牙初升
旭日东升
日上三竿
一轮红日
日高三尺
艳阳高照
烈日当头
骄阳似火
日影西斜
苦口婆心
口若悬河
心平气和
不慌不忙
语重心长
热情洋溢
恭恭敬敬
洗耳恭听
亲密无间
形影不离
情同手足
团结友爱
朝夕相处
人山人海
人声喧哗
人声嘈杂
人如潮涌
摩肩接踵
倾盆大雨
狂风暴雨
大雨滂沱
瓢泼大雨
读书学习
神情专注
学而不厌
学无止境
专心致志
日积月累
似懂非懂
普天同庆
彩旗飞舞
欢天喜地
张灯结彩
彻夜狂欢
兴高采烈
手舞足蹈
笨手笨脚
挤眉弄眼