package com;
import java.awt.*;
import java.awt.geom.*;
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 PictureCheckCode extends HttpServlet {
public PictureCheckCode() {
super();
}
public void destroy() {
super.destroy();
}
public void init() throws ServletException {
super.init();
}
// 获取随机颜色
public Color getRandColor(int s, int e) {
Random random = new Random();
if (s > 255) s = 255;
if (e > 255) e = 255;
int r = s + random.nextInt(e - s); //随机生成RGB颜色中的r值
int g = s + random.nextInt(e - s); //随机生成RGB颜色中的g值
int b = s + random.nextInt(e - s); //随机生成RGB颜色中的b值
return new Color(r, g, b);
}
public 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 = 86;
int height = 22;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Graphics2D g2d = (Graphics2D) g;
Random random = new Random();
Font mFont = new Font("黑体", Font.BOLD, 17);
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
g.setFont(mFont);
g.setColor(getRandColor(180, 200));
// 画随机的线条
for (int i = 0; i < 100; i++) {
int x = random.nextInt(width - 1);
int y = random.nextInt(height - 1);
int x1 = random.nextInt(6) + 1;
int y1 = random.nextInt(12) + 1;
BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL);
Line2D line = new Line2D.Double(x, y, x + x1, y + y1);
g2d.setStroke(bs);
g2d.draw(line);
}
String sRand = "";
// 输出随机的验证文字
String ctmp = "";
int itmp = 0;
for (int i = 0; i < 4; i++) {
//random = new Random(new java.util.Date().getTime() + i);
switch (random.nextInt(4)) {
case 1:
itmp = random.nextInt(26) + 65; // 生成A~Z的字母
ctmp = String.valueOf((char) itmp);
break;
case 2: // 生成汉字
String[] rBase = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
"9", "a", "b", "c", "d", "e", "f" };
// 生成第1位的区码
int r1 = random.nextInt(3) + 11; //生成11到14之间的随机数
String str_r1 = rBase[r1];
// 生成第2位的区码
int r2;
if (r1 == 13) {
r2 = random.nextInt(7); //生成0到7之间的随机数
} else {
r2 = random.nextInt(16); //生成0到16之间的随机数
}
String str_r2 = rBase[r2];
// 生成第1位的位码
int r3 = random.nextInt(6) + 10; //生成10到16之间的随机数
String str_r3 = rBase[r3];
// 生成第2位的位码
int r4;
if (r3 == 10) {
r4 = random.nextInt(15) + 1; //生成1到16之间的随机数
} else if (r3 == 15) {
r4 = random.nextInt(15); //生成0到15之间的随机数
} else {
r4 = random.nextInt(16); //生成0到16之间的随机数
}
String str_r4 = rBase[r4];
System.out.println(str_r1 + str_r2 + str_r3 + str_r4);
// 将生成机内码转换为汉字
byte[] bytes = new byte[2];
//将生成的区码保存到字节数组的第1个元素中
String str_r12 = str_r1 + str_r2;
int tempLow = Integer.parseInt(str_r12, 16);
bytes[0] = (byte) tempLow;
//将生成的位码保存到字节数组的第2个元素中
String str_r34 = str_r3 + str_r4;
int tempHigh = Integer.parseInt(str_r34, 16);
bytes[1] = (byte) tempHigh;
ctmp = new String(bytes); //根据字节数组生成汉字
// System.out.println("生成汉字:" + ctmp);
break;
default:
itmp = random.nextInt(10) + 48; // 生成0~9的数字
ctmp = String.valueOf((char) itmp);
break;
}
sRand += ctmp;
Color color = new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110));
g.setColor(color);
/** **随机缩放文字并将文字旋转指定角度* */
// 将文字旋转指定角度
Graphics2D g2d_word = (Graphics2D) g;
AffineTransform trans = new AffineTransform();
trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7);
// 缩放文字
float scaleSize = random.nextFloat() +0.8f;
if (scaleSize > 1f) scaleSize = 1f;
trans.scale(scaleSize, scaleSize);
g2d_word.setTransform(trans);
/** ********************* */
g.drawString(ctmp, 15 * i + 18, 14);
}
// 将生成的验证码保存到Session中
HttpSession session = request.getSession(true);
session.setAttribute("randCheckCode", sRand);
g.dispose();
ImageIO.write(image, "JPEG", response.getOutputStream());
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本程序共提供了三种图文验证方法,第1种是英文、数字和中文混合的彩色验证码,如图1.1所示。第2种是Ajax实现无刷新的彩色验证码,如图1.2所示。第3种是加密的验证码,如图1.3所示。 登录用户名和密码统一为mr,mrsoft。 图1.1 英文、数字和中文混合的彩色验证码的运行结果 图1.2 Ajax实现无刷新的彩色验证码的运行结果 图1.3 加密的验证码的运行结果
资源推荐
资源详情
资源评论
收起资源包目录
JAVAWEB图文验证码模块源代码.rar (77个子文件)
02
sl
02
WEB-INF
web.xml 813B
lib
classes
com
PictureCheckCode.class 4KB
index.jsp 9KB
checkCheckCode.jsp 250B
JS
AjaxRequest.js 1KB
check.jsp 656B
getPictureCheckCode.jsp 353B
top.jsp 267B
src
com
PictureCheckCode.java 3KB
Css
style.css 2KB
images
reply_navigate.gif 12KB
dui2.gif 340B
bg.gif 2KB
tishi2.gif 310B
topic_navigate.gif 6KB
mrbccd.gif 2KB
mrbccd.jpg 38KB
bg_top.gif 41KB
cuo2.gif 236B
bg_left.gif 82B
face
face7.gif 1KB
face2.gif 1KB
face3.gif 1KB
face5.gif 1KB
face14.gif 1KB
face12.gif 1KB
face6.gif 1KB
face16.gif 1KB
face4.gif 1KB
face9.gif 1KB
face10.gif 1KB
face1.gif 1KB
face15.gif 1KB
face13.gif 1KB
face8.gif 1KB
face11.gif 1KB
face0.gif 1KB
checkCodePicture.jpg 20KB
bg_right.gif 67B
copyright.jsp 734B
03
WEB-INF
web.xml 813B
lib
classes
com
Encode.class 2KB
PictureCheckCode.class 5KB
index.jsp 3KB
CSS
style.css 2KB
src
com
Encode.java 1004B
PictureCheckCode.java 3KB
deal.jsp 4KB
images
menu_7.JPG 21KB
login_bottom.jpg 40KB
menu_1a.JPG 22KB
menu_5.JPG 21KB
login_btn_bg.jpg 14KB
login_btn_bg.gif 991B
left_top.GIF 2KB
menu_6.JPG 22KB
logo.jpg 68KB
login_top.jpg 49KB
menu_4.JPG 21KB
menu_1.JPG 22KB
menu_3.JPG 21KB
01
WEB-INF
web.xml 813B
lib
classes
com
PictureCheckCode.class 6KB
index.jsp 2KB
src
com
PictureCheckCode.java 5KB
deal.jsp 2KB
Css
style.css 862B
images
main_top.gif 20KB
error.jpg 4KB
welcome.jpg 121KB
btn_bg.jpg 15KB
error1.jpg 19KB
main_head.gif 148B
success.gif 38KB
loginBg.jpg 47KB
main_bg.gif 63B
程序使用说明.doc 273KB
共 77 条
- 1
懒散的猿鼋
- 粉丝: 5
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页