验证码和session不同步

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

public class AuthImg extends HttpServlet {
private static final String CONTENT_TYPE="text/html;charset=gb2312";
private Font font=new Font("Times New Roman",Font.PLAIN,17);

public void init() throws ServletException{
super.init();
}

public 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);
}

public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
response.setContentType("image/jpeg");
int width=100;
int height=18;
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(1,1,width-1,height-1);
g.setColor(new Color(102,102,102));
g.drawRect(0,0,width-1,height-1);
g.setFont(font);
g.setColor(getRandColor(160,200));
for(int i=0 ;i<155;i++){
int x=random.nextInt(width-1);
int y=random.nextInt(height-1);
int x1=random.nextInt(6)+1;
int y1=random.nextInt(12)+1;
g.drawLine(x,y,x+x1,y+y1);
}
for(int i=0 ;i<70;i++){
int x=random.nextInt(width-1);
int y=random.nextInt(height-1);
int x1=random.nextInt(12)+1;
int y1=random.nextInt(6)+1;
g.drawLine(x,y,x+x1,y+y1);
}
String rand="";
for(int i=0;i<6;i++){
int itmp=random.nextInt(26)+65;
char ctmp=(char)itmp;
rand+=String.valueOf(ctmp);
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(String.valueOf(ctmp),15*i+10,16);
}
HttpSession session=request.getSession(true);
session.setAttribute("rand",rand);
g.dispose();
ImageIO.write(image,"JPEG",response.getOutputStream());

System.out.println(request.getSession().getAttribute("rand"));
}

public void destroy(){

}
}
...全文
3636 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
scpcyzxb 2011-09-11
  • 打赏
  • 举报
回复
前台验证也可以研究一下撒
alphones 2007-10-15
  • 打赏
  • 举报
回复
统一session是不是就可以了呢!

有没有方法将request在两个jsp页面传递
tanfeng1112 2007-08-27
  • 打赏
  • 举报
回复
在jsp里生成验证码,然后把验证码放入session
在javascript里比较时,先用ajax从后台取这个session
然后就可以在客户端比较
注意从ajax里返回的值要去掉前后空格
javabeginner2006 2007-06-20
  • 打赏
  • 举报
回复
有个方案了,不知道行不行?
lz自己去测试下.
你把<%
String s=(String)request.getSession().getAttribute("rand");
out.println(s);
%>
这段代码写到其他文件里,然后包含进来.应该能显示吧.楼主自己测试.
无论是否成功,都说一声.
javabeginner2006 2007-06-20
  • 打赏
  • 举报
回复
没有想到解决方案.
我想问下,你为什么一定要显示在页面上呢?????
wbj00 2007-06-20
  • 打赏
  • 举报
回复
我刚试了下,确是是一个session是只在页面里存的是上一个session的值,但怎样才能使页面里的session和实际的session同步呢??
wbj00 2007-06-20
  • 打赏
  • 举报
回复
你们是怎么解决这个问题的???
wbj00 2007-06-20
  • 打赏
  • 举报
回复
javabeginner2006()
~~~~~~~~~~~~~~~~~~~~~~

刚改了,还是不行
Eric_Yu_Nupt 2007-06-20
  • 打赏
  • 举报
回复
也就是说~提交服务的时候二者是相同的,而不是你所看到的那样~
javabeginner2006 2007-06-20
  • 打赏
  • 举报
回复
总之我知道一点,当页面显示以后,session中的验证码和图片显示的是一样的.
至于你说的问题:我估计jsp中request,页面仍然认为是原来请求的那个,所以得到的session也是原来的.你试试request.getSession()改成session看看;
Eric_Yu_Nupt 2007-06-20
  • 打赏
  • 举报
回复
这个问题我刚遇到过~实际上是同步的~
你刷新的时候,session显示的是上一个值~
而你提交服务的时候session又被赋予验证码所显示的值了~
出现问题也许是你验证码与你session值比较方式出现的问题~
wbj00 2007-06-20
  • 打赏
  • 举报
回复
另外从servlet中取session打出来的和图片显示的却是一样,难得和页面的不是一个session???
wbj00 2007-06-20
  • 打赏
  • 举报
回复
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<img src="/authimg">
<%
String s=(String)request.getSession().getAttribute("rand");
out.println(s);
%>
</body>
</html>
就这样,页面打出来的和图片显示的不一样,总是慢一步
lutao050306 2007-06-20
  • 打赏
  • 举报
回复
和你的JSP代码有关.把JSP放出来
javabeginner2006 2007-06-20
  • 打赏
  • 举报
回复
jsp的代码呢?贴出来看看,就是显示验证码的页面
wbj00 2007-06-20
  • 打赏
  • 举报
回复
还没人吗,自己再顶!!!
wbj00 2007-06-20
  • 打赏
  • 举报
回复
bigc2001(大C)
~~~~~~~~~~~~~~~~~~~~~

freemarker模板 我不懂,不过你只要先写SESSION就可以了,无论在哪里写。

有个项目是这样的index.jsp 自动跳转到 login.do(struts action) 在action里面写SESSION--显示 login.jsp页面,页面的图片类请求再读SESSION生成图片。

~~~~~~~~~~~~~~~~你的这个建议我试过了,果然能行,

wbj00 2007-06-20
  • 打赏
  • 举报
回复
javabeginner2006()
~~~~~~~~~~~~~~~~~~~~~~~~

呵呵,你说得也对,学习了,今天受益匪浅啊,很谢谢大家
javabeginner2006 2007-06-20
  • 打赏
  • 举报
回复
javabeginner2006()
~~~~~~~~~~~~~~~~~~~~~~~~
验证码还要到后台去难证吗?我看一般的网站都是在前台弄的啊,
就用javascript验证的

你在哪个网上看到的,一般验证码是为了提高访问网站的安全性而设置的,如果只是javaScript验证的话,就完全没有意义了,仅仅是个摆设。不过我见过有些网站是用ajax来验证的。很少见到就用javaScript的纯前台验证
wbj00 2007-06-20
  • 打赏
  • 举报
回复
哦,我知道了,很谢谢上面的几位,今天大有收获,我MSN:wbj3344@163.com 有空加我啊,我以后好请教。。。
加载更多回复(14)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧