您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > JSP >

同时打开多个带验证码页面问题的一种解决方案

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 13:48 点击:

关于如何在Struts下使用jsp图片验证码,请参考另外一篇文章《jsp图片验证码》。其原理就是随机生成4位验证码,将其写入Session,同时生成图片显示出来。这样就出问题了。如果同时打开多个带验证码页面,那么只有最后的页面验证码会通过验证,其他的均提示验证码错误。

其实这个问题当初添加验证码功能的时候就知道会有,但是一直没改,因为很少有人打开多个登录页面,就算是出错了刷新一次就能解决。最近负责项目的师兄盯住这个问题了,所以不得不改改。

这个错误的关键代码在于:

request.getSession().setAttribute("checkcode",sRand);

也就是说每次生成验证码都存在Session的checkcode变量里。这样每次生成的验证码都会覆盖上次的值。

网上有许多解决方案,其中一种是给验证码加时间戳。

在将验证码存入Session时使用以下代码:

String timestamp=(String) request.getQueryString();//我这里就一个参数
request.getSession().setAttribute("checkcode"+timestamp,sRand);

其实原理很简单,就是加入时间戳,把存入Session的变量区别开来。

使用的时候在表单里加入:

<input id="timestamp" type="hidden" name="timestamp" value="">

同时写一个图片的刷新脚本

function loadimage(){
    var timestamp=(new Date()).valueOf(); //timestamp.
    document.getElementById("randImage").src = "<%=request.getContextPath()%>/image.jsp?"+timestamp;
      document.getElementById("timestamp").value = timestamp;
  }

服务器端直接在form的validate()里使用如下代码取出checkcode即可。

String checkcode= (String) request.getSession().getAttribute("checkcode"+timestamp);

用完记得顺手清理session:

request.getSession().removeAttribute("checkcode"+timestamp);

参考链接:http://blog.kongxz.com/2010/01/solution-to-verifying-code-in-multiple-instances/

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • JSP与Servlet
      • 自己动手写MiniBBS系列(基本篇)之用户登录
      • JSP取当前日期
      • JDBC 入门(一)
      • 打开一个jsp页面默认查询所有数据,调用action
      • 使用JSP标签库验证用户的输入(2)完
      • 自定义JSP标签(tag)浅议
      • WIN98/2000下的jsp服务器
      • JSP内建对象(二)
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1