做jsp表单验证码,但是一直是错误,最后我输出了session,结果session中的验证码是上一个

xiaobowl 2014-11-27 04:38:02



这个怎么解决啊
...全文
573 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen870201 2014-11-29
  • 打赏
  • 举报
回复
步骤似乎错了
加嘞个油 2014-11-28
  • 打赏
  • 举报
回复
同意16楼,web项目建议你写个生成验证码的servlet,页面调用就行了
快乐的2 2014-11-28
  • 打赏
  • 举报
回复
跟你说说吧,你所做的验证方式本身就是错误的。至于错误的原因我会在下面给你解释: 1. 你的页面输出验证码明文的时候,你的新验证码还没有被生成,因为图片时在HTML页面加载后才访问的,也就是说你已经把验证码输出到页面了才又去访问的验证码生成功能,所以不论你怎么做,显示的都肯定是上一次的。 2.给你的建议是单独做一个页面用于显示后台验证码,该页面在验证码图片显示完成后你手动刷新下就行了。
zhengjianhua7 2014-11-27
  • 打赏
  • 举报
回复
楼主你绑定session 这步session.setAttribute("rCode",sRand); 少了HttpSession session =request.getSession();没报错?
zhengjianhua7 2014-11-27
  • 打赏
  • 举报
回复
不介意的话换一种输出方式吧 1.图片压缩输出

response.setContentType("image/jpeg");
OutputStream ops = response.getOutputStream();
//write方法:将原始图片(image)使用
ImageIO.write(image, "jpeg",	ops);
ops.close();
2.jsp页面

<h3>验证码:<h3/>
<img id="num" src="checkcode" />
<a href="javascript:;" onclick="document.getElementById('num').src = 'checkcode?'+Math.random()">换一张</a>
src=“checkcode”中换成你在xml中配置的生成验证码的servlet
xiaobowl 2014-11-27
  • 打赏
  • 举报
回复
引用 12 楼 magi1201 的回复:
没看出什么问题 session.setAttribute("rCode",sRand); 打印下验证码,看是多少? String rand = (String)request.getSession().getAttribute("rCode"); 上面一行是后才存放的验证码吧,打印下验证码 String input = request.getParameter("rand"); 这一行代码是什么作用呢?
刚打印了一下,前台显示的验证码跟生成验证码是一样的,就是前台那里调用session总是慢一步
姜小白- 2014-11-27
  • 打赏
  • 举报
回复
没看出什么问题 session.setAttribute("rCode",sRand); 打印下验证码,看是多少? String rand = (String)request.getSession().getAttribute("rCode"); 上面一行是后才存放的验证码吧,打印下验证码 String input = request.getParameter("rand"); 这一行代码是什么作用呢?
猎魔人-不纯 2014-11-27
  • 打赏
  • 举报
回复
感觉没问题,你把这个放在图片请求下试试
<% 
                    String rand = (String)request.getSession().getAttribute("rCode");
                    String input = request.getParameter("rand");
                    %>
                    <%= rand %>
xiaobowl 2014-11-27
  • 打赏
  • 举报
回复
引用 8 楼 magi1201 的回复:
楼主把后台存放验证码的代码和前台获取的代码都贴出来看看
回复了,你看下
xiaobowl 2014-11-27
  • 打赏
  • 举报
回复
这是验证码生成页面,,,image.jsp
<%@ page contentType="image/jpeg" language="java" import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>  
  
<%!  
    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-catch");  
    response.setDateHeader("Expires",0);  
      
    //在内存中创建图象  
    int width = 150;  
    int height = 50;  
    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("Tines Nev Roman",Font.PLAIN,30));  
    //随机产生干扰线  
    g.setColor(getRandColor(160,200));  
    for(int i = 0; i < 255; i++){  
        int x = random.nextInt(width);  
        int y = random.nextInt(height);  
        int xl = random.nextInt(12);  
        int yl = random.nextInt(12);  
    }  
    //随机产生认证码,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,30*i+6,35);  
    }  
    session.setAttribute("rCode",sRand);  
    
    //图像生效  
    g.dispose();  
    //输出图像到页面  
    ImageIO.write(image,"JPEG",response.getOutputStream());  
    out.clear();  
    out = pageContext.pushBody(); 
    
    
    
%>  
这是前台显示调用验证码图片代码
<label for="image">验证码</label>
					
					<input type="text" id="image" name="image" placeholder="请输入验证码" style="width:200px;float:left;">
					<span id="num" style="color:red"></span>
					
					<% 
					String rand = (String)request.getSession().getAttribute("rCode");
					String input = request.getParameter("rand");
					%>
					<%= rand %>
					
					<a href="#"><img alt="看不清,点击换一张" src="image.jsp" style="float:right;margin-top:-5px;" onClick="this.src=this.src+'?';return false;" >
					</a>
中间那段Java就是我获取当前的session验证码
姜小白- 2014-11-27
  • 打赏
  • 举报
回复
楼主把后台存放验证码的代码和前台获取的代码都贴出来看看
xiaobowl 2014-11-27
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
新的验证码在后台产生后,应该没有及时放进session中去吧,如果放进去了,拿到的应该是新的验证码
检查下,新的验证码出来后,怎么存放的?有没有放进session中,替换老的验证码


在验证码生成页面就已经将图片保存进去了啊,但就是显示的时候session还是上一个
姜小白- 2014-11-27
  • 打赏
  • 举报
回复
引用 4 楼 xiaobowl 的回复:
我单独弄了几个网页验证验证码都是正常的,但我在项目里面session总是慢一步
检查你项目里面的session的代码,看看session数据走向。 看看项目中session的存取数据跟你的单独网页的session有什么差异 或者 在项目中打断点,从验证码产生,放进session开始,跟踪一下session中的验证码
xiaobowl 2014-11-27
  • 打赏
  • 举报
回复


在验证码生成页面就已经将图片保存进去了啊,但就是显示的时候session还是上一个
xiaobowl 2014-11-27
  • 打赏
  • 举报
回复
我单独弄了几个网页验证验证码都是正常的,但我在项目里面session总是慢一步
猎魔人-不纯 2014-11-27
  • 打赏
  • 举报
回复
在产生图片的同时将验证码存在session中
tracy敬 2014-11-27
  • 打赏
  • 举报
回复
同上,肯定是新的验证码生成后,没有立刻放到session中
姜小白- 2014-11-27
  • 打赏
  • 举报
回复
新的验证码在后台产生后,应该没有及时放进session中去吧,如果放进去了,拿到的应该是新的验证码 检查下,新的验证码出来后,怎么存放的?有没有放进session中,替换老的验证码

81,122

社区成员

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

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