用servlet写了个验证码,,,,但是为什么刷新页面获得到的验证码总是前一个页面的验证码

bbos1994 2014-07-12 11:03:44
用servlet写了个随机产生的验证码并通过ImageIO.write输出,,同时在方法中在产生验证码之后通过request.getSession().setAttribute("verifyCode",verifyCode)设置,,然后在前台img标签中的src属性指向servlet的地址。。。。并设置了一个input标签,标签中value="<=session.getAttribute("verifyCode")>"。。。。但是问题产生了,,,为什么input的value值总是刷新页面前那个页面产生的验证码?? 小弟表达能力有限,,所以献上代码。


//Servlet的doGet方法中的代码
BufferedImage image = new BufferedImage(......);
Graphics g = image.getGraphics();

//设置g的一系列参数,,,省略...............

String verifyCode = verifyCode(); //verifyCode()是自己写的私有方法,用于产生随机代码
request.getSession().setAttribute(“verifyCode”,verifyCode);

//.........
ImageIO.write(......) //将此图片输出



//前台jsp页面的代码
<img src="//此处为servlet的mapping"><input type="text" value="<%=session.getAttribute("verifyCode")%>">

此时若是第一次加载此页面,那么input里面为空,,,刷新此页面之后,input里面的文本值为上一个页面产生的验证码,,请问这是为什么,,,难道是我不小心又执行了一次生成验证码的方法??
...全文
388 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸿洋_ 2014-07-13
  • 打赏
  • 举报
回复
代码没什么问题,先session.setAttr ,然后页面session.getAttr, 看起来没问题 之所以出现楼主的问题,是因为刷新页面时根本没再执行生成验证码的代码,因为你的img的src路径没有改变,浏览器缓存了,你在src后面添加一个随机数的参数即可。
chenluozhi 2014-07-13
  • 打赏
  • 举报
回复
哈哈,这问题我以前也遇过,挺搞笑的
bbos1994 2014-07-13
  • 打赏
  • 举报
回复
引用 8 楼 lmj623565791 的回复:
代码没什么问题,先session.setAttr ,然后页面session.getAttr, 看起来没问题 之所以出现楼主的问题,是因为刷新页面时根本没再执行生成验证码的代码,因为你的img的src路径没有改变,浏览器缓存了,你在src后面添加一个随机数的参数即可。
嗯,我把验证码放在后台验证就解决了这个问题,,回头你这种思路我也会尝试尝试的。
bbos1994 2014-07-13
  • 打赏
  • 举报
回复
引用 6 楼 stormwy 的回复:
没有很懂你意思,记得以前遇到过类似的情况,跟img的src写法有关 试试在 在 img 的src="servletpath"后面加上一个任意名字的动态参数“?s=new Date()” 带参数是为了让src在servlet输出图形验证码时变化,这样图片才会刷新。 采用js脚本实现验证码图片的刷新 document.getElementById('validateImg').src="<%=path %>/loginRandom?a="+new Date();
嗯,我把验证码放在后台验证就解决了这种问题。。。不过你这种思路我回头也会试试的。
bbos1994 2014-07-13
  • 打赏
  • 举报
回复
引用 4 楼 wlwlwlwl015 的回复:
[quote=引用 3 楼 bbos1994 的回复:] [quote=引用 1 楼 wlwlwlwl015 的回复:] 应该是代码执行顺序的问题,JSP页面加载时肯定是先执行Java代码,所以<%=session.getAttribute("verifyCode")%>这段是先被执行的,第一次必然为NULL,页面渲染完毕后,你的session中才有值,所以刷新之后自然是上一次存的值。建议你的代码不要这样写。 一般情况下,验证码的内容都是在提交表单之后在后台获取,页面上只要能显示出图片就OK,所以你没必要再去显示验证码的值,也不理解你显示它的意义何在?你提交表单之后,在后台通过request.getSession().getAttribute(“verifyCode”);肯定就能获取到了,从而也达到了验证的需求。
至于你说的这种验证方法,,,现在的网站都是这么验证的么?[/quote] 简单的应该都是这样~ 不难理解吧。。[/quote] 嗯嗯,懂了,,我已经把它放在后台验证了,这样就不会出现这样的问题了。。。你的解释很到位,先前不理解是因为对jsp页面的执行顺序没搞懂,现在懂了。。。。3q
小灯光环 2014-07-12
  • 打赏
  • 举报
回复
引用 3 楼 bbos1994 的回复:
[quote=引用 1 楼 wlwlwlwl015 的回复:] 应该是代码执行顺序的问题,JSP页面加载时肯定是先执行Java代码,所以<%=session.getAttribute("verifyCode")%>这段是先被执行的,第一次必然为NULL,页面渲染完毕后,你的session中才有值,所以刷新之后自然是上一次存的值。建议你的代码不要这样写。 一般情况下,验证码的内容都是在提交表单之后在后台获取,页面上只要能显示出图片就OK,所以你没必要再去显示验证码的值,也不理解你显示它的意义何在?你提交表单之后,在后台通过request.getSession().getAttribute(“verifyCode”);肯定就能获取到了,从而也达到了验证的需求。
至于你说的这种验证方法,,,现在的网站都是这么验证的么?[/quote] 简单的应该都是这样~ 不难理解吧。。
bbos1994 2014-07-12
  • 打赏
  • 举报
回复
引用 1 楼 wlwlwlwl015 的回复:
应该是代码执行顺序的问题,JSP页面加载时肯定是先执行Java代码,所以<%=session.getAttribute("verifyCode")%>这段是先被执行的,第一次必然为NULL,页面渲染完毕后,你的session中才有值,所以刷新之后自然是上一次存的值。建议你的代码不要这样写。 一般情况下,验证码的内容都是在提交表单之后在后台获取,页面上只要能显示出图片就OK,所以你没必要再去显示验证码的值,也不理解你显示它的意义何在?你提交表单之后,在后台通过request.getSession().getAttribute(“verifyCode”);肯定就能获取到了,从而也达到了验证的需求。
至于你说的这种验证方法,,,现在的网站都是这么验证的么?
bbos1994 2014-07-12
  • 打赏
  • 举报
回复
引用 1 楼 wlwlwlwl015 的回复:
应该是代码执行顺序的问题,JSP页面加载时肯定是先执行Java代码,所以<%=session.getAttribute("verifyCode")%>这段是先被执行的,第一次必然为NULL,页面渲染完毕后,你的session中才有值,所以刷新之后自然是上一次存的值。建议你的代码不要这样写。 一般情况下,验证码的内容都是在提交表单之后在后台获取,页面上只要能显示出图片就OK,所以你没必要再去显示验证码的值,也不理解你显示它的意义何在?你提交表单之后,在后台通过request.getSession().getAttribute(“verifyCode”);肯定就能获取到了,从而也达到了验证的需求。
我的那个input本来是hidden,然后设置了id,在前端js中,准备用来获取然后跟输入的验证码作对比,,以达到验证表单的作用,,,但是发现每次都不成功,所以设置成type=“text”,,显示出来,,这里为了表述清楚,没有说那么多,所以直接这么说了。。。。我再琢磨琢磨你的回复吧。。。
小灯光环 2014-07-12
  • 打赏
  • 举报
回复
应该是代码执行顺序的问题,JSP页面加载时肯定是先执行Java代码,所以<%=session.getAttribute("verifyCode")%>这段是先被执行的,第一次必然为NULL,页面渲染完毕后,你的session中才有值,所以刷新之后自然是上一次存的值。建议你的代码不要这样写。 一般情况下,验证码的内容都是在提交表单之后在后台获取,页面上只要能显示出图片就OK,所以你没必要再去显示验证码的值,也不理解你显示它的意义何在?你提交表单之后,在后台通过request.getSession().getAttribute(“verifyCode”);肯定就能获取到了,从而也达到了验证的需求。
willis_326 2014-07-12
  • 打赏
  • 举报
回复
没有很懂你意思,记得以前遇到过类似的情况,跟img的src写法有关 试试在 在 img 的src="servletpath"后面加上一个任意名字的动态参数“?s=new Date()” 带参数是为了让src在servlet输出图形验证码时变化,这样图片才会刷新。 采用js脚本实现验证码图片的刷新 document.getElementById('validateImg').src="<%=path %>/loginRandom?a="+new Date();
旺仔啊 2014-07-12
  • 打赏
  • 举报
回复
长知识来了、

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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