validateCode.jsp:
<%
@ page language
=
"
java
"
import
=
"
java.util.*
"
pageEncoding
=
"
UTF-8
"
%>
<%
String
path
=
request.getContextPath();
String
basePath
=
request.getScheme()
+
"
://
"
+
request.getServerName()
+
"
:
"
+
request.getServerPort()
+
path
+
"
/
"
;
%>
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>
<
html
>
<
head
>
<
base
href
="<%=basePath%>"
>
<
title
>
两组验证码
</
title
>
<
meta
http-equiv
="pragma"
content
="no-cache"
>
<
meta
http-equiv
="cache-control"
content
="no-cache"
>
<
meta
http-equiv
="expires"
content
="0"
>
<
meta
http-equiv
="keywords"
content
="keyword1,keyword2,keyword3"
>
<
meta
http-equiv
="description"
content
="This is my page"
>
</
head
>
<
body
>
Two Validate Code:
<
br
>
<
img
src
="vc_1.jsp"
/>
<
img
src
="vc_2.jsp"
/>
</
body
>
</
html
>
vc_1.jsp:
<%
@ page language
=
"
java
"
import
=
"
java.util.*
"
pageEncoding
=
"
UTF-8
"
%>
<%
@ page import
=
"
com.ysx.system.actions.*
"
%>
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>
<
html
>
<
head
>
<
title
>
验证码测试
</
title
>
</
head
>
<
body
>
<
form
name
="f1"
method
="post"
action
="login.jsp"
>
<
div
>
<%
Yzm a
=
new
Yzm();
a.service(request, response);
out.clear();
out
=
pageContext.pushBody();
%>
</
div
>
</
form
>
</
body
>
</
html
>
vc_2.jsp:
<%
@ page
import
=
"
java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*
"
%>
<%
@ page import
=
"
java.io.OutputStream
"
%>
<%
!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);
}
%>
<%
try {
response.setHeader(
"
Pragma
"
,
"
No-cache
"
);
response.setHeader(
"
Cache-Control
"
,
"
no-cache
"
);
response.setDateHeader(
"
Expires
"
,
0
);
int
width
=
60
, height
=
20
;
BufferedImage image
=
new
BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
OutputStream os
=
response.getOutputStream();
Graphics g
=
image.getGraphics();
Random random
=
new
Random();
g.setColor(getRandColor(
200
,
250
));
g.fillRect(
0
,
0
, width, height);
g.setFont(
new
Font(
"
Times New Roman
"
, Font.PLAIN,
18
));
g.setColor(getRandColor(
160
,
200
));
for
(
int
i
=
0
; i
<
155
; i
++
) {
int
x
=
random.nextInt(width);
int
y
=
random.nextInt(height);
int
xl
=
random.nextInt(
12
);
int
yl
=
random.nextInt(
12
);
g.drawLine(x, y, x
+
xl, y
+
yl);
}
String
sRand
=
""
;
for
(
int
i
=
0
; i
<
4
; i
++
) {
String
rand
=
String
.valueOf(random.nextInt(
10
));
sRand
+=
rand;
g.setColor(
new
Color(
20
+
random.nextInt(
110
),
20
+
random
.nextInt(
110
),
20
+
random.nextInt(
110
)));
g.drawString(rand,
13
*
i
+
6
,
16
);
}
session.setAttribute(
"
rand
"
, sRand);
g.dispose();
ImageIO.write(image,
"
JPEG
"
, os);
os.flush();
os.close();
os
=
null
;
response.flushBuffer();
out.clear();
out
=
pageContext.pushBody();
} catch (IllegalStateException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
%>
Yzm.java:
import
java.awt.Color;
import
java.awt.Font;
import
java.awt.Graphics2D;
import
java.awt.image.BufferedImage;
import
java.util.Random;
import
javax.imageio.ImageIO;
import
javax.servlet.
*
;
import
javax.servlet.http.
*
;
public
class
Yzm
extends
HttpServlet
{
public static final long serialVersionUID = 1L;
// 验证码图片的宽度。
private int width = 60;
// 验证码图片的高度。
private int height = 20;
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {
BufferedImage buffImg = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
// 创建一个随机数生成器类。
Random random = new Random();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 创建字体,字体的大小应该根据图片的高度来定。
Font font = new Font("Times New Roman", Font.PLAIN, 18);
// 设置字体。
g.setFont(font);
// 画边框。
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
g.setColor(Color.GRAY);
for (int i = 0; i < 10; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;
// 随机产生4位数字的验证码。
for (int i = 0; i < 4; i++) {
// 得到随机产生的验证码数字。
String strRand = String.valueOf(random.nextInt(10));
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
red = random.nextInt(200);
green = random.nextInt(200);
blue = random.nextInt(200);
// 产生随机高度 13至height之间
float imght = 0;
while (imght <= 12) {
imght = Float
.parseFloat(String.valueOf(random.nextInt(height)));
}
// 用随机产生的颜色将验证码绘制到图像中。
g.setColor(new Color(red, green, blue));
g.drawString(strRand, 13 * i + 6, imght);
// 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
// 将四位数字的验证码保存到Session中。
HttpSession session = req.getSession();
session.setAttribute("randomCode", randomCode.toString());
// 禁止图像缓存。
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
resp.setContentType("image/jpeg");
// 将图像输出到Servlet输出流中。
ServletOutputStream sos = resp.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
}
}