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
- jsp 和session不同步的问题
- jsp页面上取得的验证码的值与session中存入的值不同步的问题
- 完美解决php验证码session不同步的问题
- 完美解决php验证码session不同步的问题
- 解决jsp中验证码不同步的问题
- jsp中验证码的实现,以及ajax实现的正确的验证,解决了session不同步的问题。(我这里已测试过,可以直接用)
- ucloud时间和aws时间不同步的问题
- 解决ubuntu16.10和windows10双系统时间不同步的问题
- Acvitity和Fragment通信数据显示不同步的问题
- Linux和windows下时间不同步问题的解决办法
- 解决win10和ubuntu16.04的时间不同步问题
- jsp 关于session的问题
- 搜狗双核的JSP session问题
- javaweb登录页面验证码验证以及session中验证码值获取不同步的问题
- vmware时间不同步的问题
- 集合的同步和不同步
- 解决php session验证码不同步问题
- javaweb首次访问页面 验证码session不同步、不一致问题
- Delphi中使用SQLServer临时表
- dig命令的基本用法
- 用cron+at 调度作业
- 根据IP获取当地天气预报的实现
- ext2.2打造全新功能grid系列--批量删除篇
- jsp 和session不同步的问题
- 一个不错的PROE学习网站
- 新的年度、新的起点—我们从这里出发
- 有人用C#这样写winform
- 对“端到端”原则的理解
- 初级sql小结
- HttpUnit学习笔记
- jsp 验证码的实现
- 2008基础软件架构平台高层研讨会深圳召开