JSP动态生成验证码存储在session作用范围内

(1)在登录应用中,为防止恶意登录,常常需要服务器动态生成验证码并存储在session作用范围中,最后以图像形式返回给客户端显示

(2)下边的代码实现的功能:写一个JSP页,动态生成一个验证码,存储在session作用范围内,并以图像形式返回给客户端显示。

另写一个JSP页面,引用此JSP页面生成的验证码;

authen.jsp代码如下:

?
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
<%@ page import = "java.awt.*,java.awt.image.*,java.util.*,com.sun.image.codec.jpeg.*" %>
<%!
//根据提供的ab产生随机的颜色变化范围
Color getColor( int a, int b){
int n=b-a;
Random rd= new Random();
int cr=a+rd.nextInt(n);
int cg=a+rd.nextInt(n);
int cb=a+rd.nextInt(n);
 
return new Color(cr,cg,cb);
}
%>
<% //下边三行取消客户端游览器缓存验证码的功能
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(getColor( 200 , 250 ));
g.fillRect( 0 , 0 , width, height);
 
g.setFont( new Font( "Times New Roman" ,Font.BOLD, 18 ));
 
g.setColor(getColor( 160 , 200 ));
for ( int i= 0 ;i< 160 ;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 number=String.valueOf( 1000 +random.nextInt( 8999 ));
String name=request.getParameter( "name" );
session.setAttribute(name,number);
 
g.setColor(getColor( 20 , 130 ));
int x=( int )(width* 0.2 );
int y=( int )(height* 0.8 );
g.drawString(number,x,y);
g.dispose();
 
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image);
out.close();
%>

再建一个test.jsp页面 调用验证码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page contentType= "text/html; charset=gb2312" language= "java" import = "java.sql.*" errorPage= "" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv= "Content-Type" content= "text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
 
<body>
<% //同样实现取消客户端缓存
response.setHeader( "Pragma" , "No-cache" );
response.setHeader( "Cache-Control" , "no-cache" );
response.setDateHeader( "Expires" , 0 );
String name= "loginCode" ;
%>
验证码:<img src= "authen.jsp?name=<%=name%>" />
</body>
</html>

(3)在上述的两个页面中都有取消客户端缓存的功能,这是因为再有的游览器中,比如使用的IE游览器的游览方式,

会先将图片放在缓存中,当再次请求的时候会现在内存中查找是不是已经有了,有的话就不在请求,这使得在刷新验

证码的时候 失败,所以要使游览器不读取缓存的图片,就需要取消缓存;

(4)OK!到此结束!

.................... 【.........阅读全文】

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值