JSP生成验证码

本文介绍了一种使用Java生成和验证验证码的方法。通过在内存中创建图像并利用随机颜色和线条绘制背景,生成包含随机数字的验证码图片。此外,还实现了通过JSP页面展示验证码图片,并在用户输入验证码后进行验证的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

image.jsp

<% @ page language = "java" import = "java.util.*" pageEncoding = "gb2312" %>
<% @ page contentType = "image/jpeg" import = "java.awt.*,
java.awt.image.*,java.util.*,javax.imageio.*" %>
<% !
/ / 随机颜色
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 ) ;
}
%>
<%
out . clear ( ) ;
/ / 设置页面不缓存
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 ) ;
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
session . setAttribute ( "code" , sRand ) ;
g . dispose ( ) ;
/ / 输出图像
ImageIO . write ( image , "JPEG" , response . getOutputStream ( ) ) ;
%>
login.jsp

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<% @ page contentType = "text/html; charset=gb2312" language = "java" import = "java.sql.*" errorPage = "" %>
<html>
<head>
<title> 登录页面 </title>
<script language="javascript">
function loadimage ( ) {
document . getElementById ( "randImage" ) . src = "image.jsp?" + Math . random ( ) ;
}
</script>
</head>
<body>
<form action = "check.jsp" method = "post" name = "loginForm" >
<td width = "118" height = "22" valign = "middle" align = "center" > <input type = "text" name = "code" size = "15" > </td>
<td width = "138" align = "center" > <a href = "javascript:loadimage();" > <img name = "randImage" id = "randImage" src = "image.jsp" width = "60" height = "20" valign = "middle" border = "1" > </a> 点击图片刷新
<input type = "submit" name = "login" value = "提交" > </td>
</form>
</body>
</html>
check.jsp

XHTML
1
2
3
4
5
6
7
8
9
10
<% @ page contentType = "text/html; charset=gb2312" language = "java" %>
<%
String rand = ( String ) session . getAttribute ( "code" ) ;
String input = request . getParameter ( "code" ) ;
if ( rand . equals ( input ) ) {
out . print ( "<script>alert('验证成功');</script>" ) ;
} else {
out . print ( "<script>alert('验证失败');location.href='login.jsp';</script>" ) ;
}
%>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值