首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

JSP验证码有关问题

2012-02-04 
JSP验证码问题在使用验证码的时候碰到以下问题:A页面使用验证码,显示为1234,再重新打开B页面(B页面也使用

JSP验证码问题
在使用验证码的时候碰到以下问题:A页面使用验证码,显示为1234,再重新打开B页面(B页面也使用了验证码,显示为2341),当回到A页面输入验证码的时候,输入1234肯定出错,因为验证码在B页面中刷新了,但是有些用户不清楚这个原理,肯定会输入1234,提示验证码错误,不知道如何避免这种错误???也就是说在A页面输入1234验证成功,不管打开的新页面是否使用了验证码

代码如下:
<%@   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());


%>  

---------------使用验证码图片的文件---------a.jsp------------------------------------

<%@   page   contentType= "text/html;charset=gb2312 "   %>


<!DOCTYPE   HTML   PUBLIC   "-//W3C//DTD   HTML   4.01   Transitional//EN ">
<html>
<head>
<title> 认证码输入页面 </title>
<meta   http-equiv= "Content-Type "   content= "text/html;   charset=gb2312 ">
<META   HTTP-EQUIV= "Pragma "   CONTENT= "no-cache ">  
<META   HTTP-EQUIV= "Cache-Control "   CONTENT= "no-cache ">  
<META   HTTP-EQUIV= "Expires "   CONTENT= "0 ">  
</head>
<body>
<form   method=post   action= "check.jsp ">
<table>
<tr>
<td   align=left> 系统产生的认证码: </td>
<td> <img   border=0   src= "image.jsp "> </td>
</tr>
<tr>
<td   align=left> 输入上面的认证码: </td>
<td> <input   type=text   name=rand   maxlength=4   value= " "> </td>
</tr>
<tr>
<td   colspan=2   align=center> <input   type=submit   value= "提交检测 "> </td>
</tr>
</form>
</body>
</html>

-----------------验证的页面----------check.jsp

<%@   page   contentType= "text/html;   charset=gb2312 "   language= "java "   import= "java.sql.* "   errorPage= " "   %>
<html>
<head>
<title> 认证码验证页面 </title>
<meta   http-equiv= "Content-Type "   content= "text/html;   charset=gb2312 ">
<META   HTTP-EQUIV= "Pragma "   CONTENT= "no-cache ">  
<META   HTTP-EQUIV= "Cache-Control "   CONTENT= "no-cache ">  
<META   HTTP-EQUIV= "Expires "   CONTENT= "0 ">  
</head>

<body>
<%  
String   rand   =   (String)session.getAttribute( "rand ");
String   input   =   request.getParameter( "rand ");
%>
系统产生的认证码为:   <%=   rand   %> <br>
您输入的认证码为:   <%=   input   %> <br>
<br>
<%
    if   (rand.equals(input))   {
%>
<font   color=green> 输入相同,认证成功! </font>
<%
    }   else   {
%>
<font   color=red> 输入不同,认证失败! </font>
<%
    }
%>
</body>
</html>



[解决办法]
晕死,这种问题不好处理,可以不通的地方用不同的名字;但是这样的话会累积很多个验证码sesion,所以每次用了就要清掉。设计时最好不要出现这种情况。
[解决办法]
过去写的文章:
http://www.javaresearch.org/article/50447.htm
[解决办法]
把它存放到SESSION里去.然后可以取不同的名字
[解决办法]
做个标记,以后用到
[解决办法]
第一次验证通过后就增加session,第二页先检测session,如果session为空再检查验证码。
[解决办法]
保存过多的session会带来性能的大幅下降,不建议这样做.
------解决方案--------------------


同意楼上意见

热点排行