有一产生验证码rand.jsp页面:
<%!
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=46, height=16;
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,11*i+1,12);
}session.setAttribute("rand",sRand);//session保存rand// 图象生效
g.dispose();// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%> 登陆页面index.jsp:<body>
<form action="<%=request.getContextPath()%>/login.do" name="loginform" method="post">
<table>
<tr>
<td>用户:<input type=textbox name="username" value="" /></td>
</tr>
<tr>
<td>密码:<input type=password name="password" value="" /></td>
</tr>
<tr>
<td>验证码:<input type=textbox name="randt" value="" />
<img border=0 src="rand.jsp" >
</td>
</tr>
<tr>
<td>
<input type=submit value="登陆" name="loginsub" >
<input type=reset value="重写" name="loginres" >
</td>
</tr>
<%=session.getAttribute("rand") %>
</table>
</body>
为什么这里的session.getAttribute("rand") 的值 和 <img border=0 src="rand.jsp>的值显示出来的不一样呢? session.getAttribute("rand") 显示的是 <img border=0 src="rand.jsp>的前一个值,如果是第一次 session.getAttribute("rand") 显示的是null,而<img border=0 src="rand.jsp>却有值
但是在LoginAction中
session.getAttribute("rand");
String rand = (String)session.getAttribute("rand");
String randt= forms.getRandt() ;
if(randt.equals(rand))
{相等}
else{不等}
却是相等的,但是有时候前1、2次填写的时候会提示不等,刷新几次再填则相当了。请教各位大侠,这是什么原因啊?先谢谢了!
<%!
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=46, height=16;
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,11*i+1,12);
}session.setAttribute("rand",sRand);//session保存rand// 图象生效
g.dispose();// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%> 登陆页面index.jsp:<body>
<form action="<%=request.getContextPath()%>/login.do" name="loginform" method="post">
<table>
<tr>
<td>用户:<input type=textbox name="username" value="" /></td>
</tr>
<tr>
<td>密码:<input type=password name="password" value="" /></td>
</tr>
<tr>
<td>验证码:<input type=textbox name="randt" value="" />
<img border=0 src="rand.jsp" >
</td>
</tr>
<tr>
<td>
<input type=submit value="登陆" name="loginsub" >
<input type=reset value="重写" name="loginres" >
</td>
</tr>
<%=session.getAttribute("rand") %>
</table>
</body>
为什么这里的session.getAttribute("rand") 的值 和 <img border=0 src="rand.jsp>的值显示出来的不一样呢? session.getAttribute("rand") 显示的是 <img border=0 src="rand.jsp>的前一个值,如果是第一次 session.getAttribute("rand") 显示的是null,而<img border=0 src="rand.jsp>却有值
但是在LoginAction中
session.getAttribute("rand");
String rand = (String)session.getAttribute("rand");
String randt= forms.getRandt() ;
if(randt.equals(rand))
{相等}
else{不等}
却是相等的,但是有时候前1、2次填写的时候会提示不等,刷新几次再填则相当了。请教各位大侠,这是什么原因啊?先谢谢了!
解决方案 »
- MySQL 5.5 Command Line Client 窗口一输密码就退出
- 关于struts2标签
- 关于compass的distinct问题
- 表单Value赋值为脚本变量的问题,急!
- 明天我要坐汽车去深圳一趟,大家说说有什么地方要注意吗?
- 从oracle 中读取blob字段 返回inputstream 后直接把inputstream 写入sqlserver数据库image字段
- 各位大虾,小弟最近在研究一个开源网上商成项目turboshop,但下载时没有相关应用程序源码。。下载时已打包为turboshop.jar,在lib目录下,我反编译turboshop.jar后放在myeclipse有很多错误,麻烦哪位帮帮我。。
- 关于日期的判断,大家来帮帮忙?
- 防止重复提交(UP有分)急
- 高手看一下我的程序(关于数据库删除)-在线等待
- 字符串标准答案与所填答案的比较
- 请教struts中ActionMessages的问题,急
我就不懂了,你这人说话怎么这么尖酸刻薄呢?
getAttribute
得到的setAttribute传过来的值什么时候set的呢,上次页面(或控制程序,or XXlistener)~~
后面的 LoginAction 中相等也是应该的,至于为什么会有1,2次不相等。。会不会是你看错了或者写错了啊。
总的来说代码应该没有什么问题吧
确实会有第一次不相等,因为LoginAction里的session是在HttpServletRequest.getsession()的时候才创建,而第一次显示的rand session是 HttpServletRequest.getsession()没有执行,所以才回出现这个问题吧?
我是这样理解的,不知我对了没有?还请各位指教。
第一次不相等;
这些问题该怎么解决呢?
这样写还有一个问题就是:当你成功登陆后,再次刷新页面,就会出现验证码不相等情况,如何避免这个情况呢?