java图片验证码3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
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());
}
}
|
下面的例子是用Servlet生成的一个验证码,例子是模拟登陆。
login.jsp
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>验证码</title>
- </head>
- <body>
- <form action="${pageContext.request.contextPath }/servlet/LoginServlet">
- <table border="0" cellspacing="0" cellpadding="0" width="50%">
- <tr>
- <td width="20%" align="right">用户名:</td><td colspan="2"><input type="text" name="username" value="" size="34"/></td>
- </tr>
- <tr>
- <td width="20%" align="right">密 码:</td><td colspan="2"><input type="password" name="password" value="" size="35"/></td>
- </tr>
- <tr>
- <td width="20%" align="right">验证码:</td><td width="21%"><input type="text" name="code" value="" size="15"/></td><td align="left"><img src="${pageContext.request.contextPath }/servlet/ImageCodeMakerServlet" width="100px" height="30" /></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
在web.xml中
- <servlet>
- <servlet-name>login</servlet-name>
- <servlet-class>com.web.LoginServlet</servlet-class>
- </servlet>
- <servlet>
- <servlet-name>imageCodeMakerServlet</servlet-name>
- <servlet-class>com.web.ImageCodeMakerServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>login</servlet-name>
- <url-pattern>/servlet/LoginServlet</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>imageCodeMakerServlet</servlet-name>
- <url-pattern>/servlet/ImageCodeMakerServlet</url-pattern>
- </servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.web.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>imageCodeMakerServlet</servlet-name>
<servlet-class>com.web.ImageCodeMakerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>imageCodeMakerServlet</servlet-name>
<url-pattern>/servlet/ImageCodeMakerServlet</url-pattern>
</servlet-mapping>
在后台Servlet里
- import java.io.IOException;
- 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 LoginServlet extends HttpServlet{
- @Override
- protected void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String username = request.getParameter("username");
- String password = request.getParameter("password");
- String code = request.getParameter("code");// 页面,用户输入的验证码
- HttpSession session = request.getSession();
- String randCode = (String)session.getAttribute("randCode");// 得到系统生成的验证码
- if(randCode.equals(code)){// 验证码输入正确
- System.out.println("验证码输入正确");
- }else{
- System.out.println("验证码不正确");
- }
- }
- }