我有个image.jsp ,里面随即产生的验证码,保存到session (validate)中。
然后我有个login.jsp页面
String ss=(String)session.getAttirbute("validate");<input type="text" name="ch">
<image src="image.jsp">显示image产生的随机数.然后我验证他在登陆时候 输入的验证码是否正确用 js函数
function validate(a){
if($('ch').value!=a)
{
alert('验证码错误');
return false;
}
}
当用户点确认时提交
<input type="submit" value="确认" onClick="return validate('<%=ss%>')">
现在我遇到的问题是,
因为 那随机数 是保存在session中的,
比如用户第一次到login.jspy页面时产生的随机数是 1423
然后我刷新login.jsp页面,页面上显示的是 2235,但是session中的值还是没有改变(1423),
然后用javaScript判断的时候肯定不成立, 我知道是session的问题,但是没什么解决方案,
各位帮忙了....
然后我有个login.jsp页面
String ss=(String)session.getAttirbute("validate");<input type="text" name="ch">
<image src="image.jsp">显示image产生的随机数.然后我验证他在登陆时候 输入的验证码是否正确用 js函数
function validate(a){
if($('ch').value!=a)
{
alert('验证码错误');
return false;
}
}
当用户点确认时提交
<input type="submit" value="确认" onClick="return validate('<%=ss%>')">
现在我遇到的问题是,
因为 那随机数 是保存在session中的,
比如用户第一次到login.jspy页面时产生的随机数是 1423
然后我刷新login.jsp页面,页面上显示的是 2235,但是session中的值还是没有改变(1423),
然后用javaScript判断的时候肯定不成立, 我知道是session的问题,但是没什么解决方案,
各位帮忙了....
解决方案 »
- 急救 jsp或servlet什么连接服务器数据库——谢谢
- 优秀的java程序员要掌握哪些知识?
- tomcat局域网通过域名访问
- 用jsf做的网站,但就报了这个异常/index.xhtml @10,58 value="#{userController.user.name}": Target
- 在线等待,我相信也遇到这样的问题
- Java 开发邮件 怎么样用pop3的命令?
- jsp中WEB-INF这个文件夹一定要吗?
- servlets
- 想不通MVC构架中使用javaBean有什么好处,
- 请问怎样把jspSmartUpload加入jbuilder里啊?
- 如何在Action里弹出一个window.alert();100分着急!
- javamail发送html邮件时css的问题
为了确保验证码只能被肉眼识别,验证码图片还要故意弄得“乱七八糟”、“杂乱无章”的。因此,是不可能把正确答案再以文本方式放在客户端的。
若把答案以文本形式发送到客户端,随便写个程序就可以获取到正确答案并轻松通过验证,若如此,还要那样辛辛苦苦弄出来的验证码何用?
而且,若在客户端进行验证,是有很多种方法可以跳过验证的。如果要使用图片验证码,则肯定是会回到服务器端之后才会验证的。所以,你目前应该采用的正确的做法是:1、把你那句“生成随机数并保存到session中”的代码放到image.jsp中2、login.jsp页面上的相关代码改成:<image src="" id="vimg" onclick="getVimg()" >
<script>
function getVimg()
{
document.getElementById( "vimg" ).src = "image.jsp?num=" + Math.random();
}
getVimg();
</script>这样,每次你刷新页面或单击图片时,都会重新请求image.jsp页面,你看到的图片与session中所保存的值将会是同样的。3、当表单提交回服务器端后,用reqeust.getParameter( "ch" )得到的值与session中保存的值比较就可以了。
//生成随机验证码
.....
String validateCode=....;
//保存到session
session.setAttribute("validate",validateCode);//然后在主页面,接收:
String validateCode= (String) session.getAttribute("validate");
2 用户输入验证码
3 服务器端进行比对
4 无论正确与否,都销毁session里面的验证码!
OVER,这个才是标准流程
9楼正解,你的验证码应该到服务器端取.当前也面的session和image.jsp的session不是一个session.
客户端是不要做任何验证的。否则就有漏洞了。因为验证码只能使用一次。
1 你用图片生成验证码,保存在session中
2 用户输入验证码
3 服务器端进行比对
4 无论正确与否,都销毁session里面的验证码!
销毁session 调用session.invalidate()
session.setAttribute("aa",aa); 比如现在的验证码是 1222
然后 当用户 觉得找个页面上的随机码 看不清楚,刷新login.jsp页面,(这个时候我多没提交..)
我想此时 login.jsp中的<image src="image.jsp"> 再次调用了,就是说重新生成了验证码,请注意这个时侯 login.jsp中的页面上,显示的是一个新的 验证码了,比如 3434
比如说刷新login.jsp这个页面N 次,页面上显示的是不同的验证码
但是最让我头疼的是,那个 aa 保存的 还是第一次 login.jsp加载的时候 产生的随机数 1222......
也不知道我这么说各位能否明白....
校验 验证码的问题我已经解决了,在服务器做的验证,
说下我的解决方案,当他提交的时候我在 action 得到image.jsp中的session,然后在得到login.jsp中文本框的值,进行判断,不相等就 String s="输入的验证码不正确";
session.setAttribute("aa",s) reutrn mapping.findForward() 到login.jsp
String a =(String)session.getAttribute("a");
session.removeAttribute("a");
然后用个js函数 ,在body 加载的时候就调用 <body onload="onloadings(<%=a%>)">
function onlodings(a){
if(a==null||a==""){
}else{
alert(a);
}
}
上面解决了我的问题.....
但是我在做这个校验中还是有点疑惑
1 : 假设第一次加载 login.jsp中的时候 <image src="image.jsp">显示的是 1235,我在image.jsp中输出随机生成的验证码 也是 1235,保存的在session中,但是在login.jsp中用<%String s=(String)session.getAttribute("aa")%> 读出来的却是null,然后我又刷新login.jsp 这个时侯 s 就是1235,它总是保存上一次的验证码,无论刷新多少次它总是保存你上一次显示在login.jsp中的验证码,第一次是空.