jsp 和session不同步的问题

来源:互联网 发布:b站日杂知乎 编辑:程序博客网 时间:2024/04/28 02:23
 

验证码是在页面或servlet中生成的,然后就放到session中,可页面取的时候怎么老是和servlet中的session不同步,也就是页面显示的验证码和从页面取出的验证码不一样,而且页面取出的总是上一次显示的,比如第一次显示的是 "123 ",这时取出来的就不是“123”,刷新页面后再从session中取,取出来的才是 "123 ",也就是说在页面从session中取出来的验证码总是比显示的验证码慢一拍,这是怎么回事???

这个问题其实这个问题,是我们在利用session做验证码这个问题经常遇到的问题现在我在下边提供一种错误的实现。并研究它的运行机制!

____________________image.jsp_______________________


<%@ 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);
}
%>
<%
//设置页面不缓存
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(new Color());
//g.drawRect(0,0,width-1,height-1);


// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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);
}

// 取随机产生的认证码(4位数字)
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("rand",sRand);


// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());

%>

——————————————logig.jsp————————————————

<img src="image.jsp">

<% String s=(String)session.getAttribute("rand");//取图片验证码上的值
        System.out.println("验证码值是"+s);
%>
这样就发现,我们第一次输入的是:验证码值是null,而往后呢就是比图片上的慢一拍,如此就让我们不方便去判断文本框中输入的和图片上的验证码值。

这是什么原因呢?

—————————————————————————————————————————

我们有时就感觉是不同步,其实是同步的,是我们自己不同步的问题,页面和图片同时访问SESSION,由于JSP先运行,先访问SESSION,获得的是上一次SESSION,在页面显示图片时SERVLET才运行,此时SERVLET生成一个新的代码。 (例如本例中,其实我们打开login.jsp时,先执行的(String)session.getAttribute("rand");也就是我们先取出了值,所以第一次我们输出的是null,然后image.jsp才运行,产生了一个新的图片呈现在login.jsp上,也就是在LOGIN.JSP中,取值先于产生图片验证码)

正确顺序是在JSP里设定SESSION,在SERVLET中读SESSION.

 这里有一个正确的实现:http://www.cn-java.com/www1/index.php?uid-563178-action-viewspace-itemid-10349

原创粉丝点击