jsp 和session不同步的问题
2008-12-18 10:22
211 查看
验证码是在页面或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
这个问题其实这个问题,是我们在利用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
相关文章推荐
- jsp页面上取得的验证码的值与session中存入的值不同步的问题
- jsp中验证码的实现,以及ajax实现的正确的验证,解决了session不同步的问题。(我这里已测试过,可以直接用)
- tomcat cluster session同步时保存map数据遇到的问题
- 验证码之 jsp页面显示与img里的显示内容同步问题
- javaweb首次访问页面 验证码session不同步、不一致问题
- jsp从session中取空值的问题
- 37-002-1 通过spring的OpenSessionInViewFilter解决jsp页面懒加载显示的问题
- 关于今天jsp或servlet取不到session的问题
- 也谈session在JSP和Servlet中不一致问题
- GetSession(false)在JSP和Servlet首次访问结果不同的问题
- Session集群同步问题
- javaweb登录页面验证码验证以及session中验证码值获取不同步的问题
- tomcat集群环境下,JSP页面更新同步,页面展示未更新 的问题排查
- 服务器集群同步session的问题
- session同步问题
- 集群Session一致性和同步问题
- nginx+tomcat +memcached 解决会话同步(session)问题
- 搜狗双核的JSP session问题
- tomcat memecached session 共享同步问题的解决
- 关于同一个网站下Session却不能同步的问题