验证码与session的困扰

l_dongdong 2009-04-09 10:01:16
已知: index.jsp(注册页面) Checkfunction.js(一些验证方法,里面判断用户输入是否合法,比如长度之类的,前台验证)

想要实现: 验证码在注册页面用户输入后,我现在的Checkfunction.js只是判断了验证码输入的长度是否是四位,不能为空等,

如果我想要实现验证码的校验对错,(验证码“VerifyCode”在生成时已经存入session)

想象中的办法: 1、在JSP页面用
<script type="text/javascript">
var verifyCode = "<%=session.getAttribute("verifyCode")%>";
</script>
取出verifyCode ,
然后在<span>验证码:</span> <input name="number" type="text" onBlur="checkFunction('number')" /><input type="hidden" id="verifyCode" vauel="VerifyCode">隐式的赋值给 id="verifyCode" 的input。供Checkfunction.js里面的方法调用(此处我已经用 onBlur="checkFunction('number')" 实现了一个判断,这个判断是对验证码输入长度的判断)
然后在Checkfunction.js中
function checkFunction(type){
var number=document.form1.number.value;
var verifyCode=document.getElementById("verifyCode").value;
if(verifyCode!=number){
err_alert('number',' 验证码不正确');
alert(verifyCode);
return false;
}

else
{
err_alert('number','');
}
}
function err_alert(id,err)
{

document.getElementById(id+'_id').innerHTML=err;
}
以上是我的第一种方法,呵呵,结果不用说,是失败的,里面有哪些错误,请各位赐教!!
2、用DWR(AJAX不会用,不过DWR也不熟,就是套用以前的代码)

这个我写了一半就写不下去了,因为我首先要取得session里面的verifyCode,我只知道用
HttpSession session = request.getSession(true);
String verifyCode=(String) session.getAttribute("verifyCode");来取得session里面verifyCode的值,但是这要在servlet里面才可以用request,在其他的类里面也要继承httpservlet,导包,还是一样的,这种办法返回值都是void,我需要这个类返回一个int或者Boolean,然后才能用JS里面来判断,
我也尝试在servlet里面写个新的方法,但是写一点就没思路了,新方法里面还要用request的,request在里面只有用在doget、dopost才不会报错。
所以这方法我也迷茫了。还是要请各位指点!我才接触JAVA相当菜,还请各位不要笑话。感谢!!

我还想请问下,是不是我以上的两种思路都可以实现?请各位对我的思路点评下,感谢!!!!!!(有朋友对我说这里可以用上下文context,我也不是很理解,跟这个有关系吗)
...全文
423 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
l_dongdong 2009-04-09
  • 打赏
  • 举报
回复
好的 我先去找了例子
谢谢gzwlj
gzwlj 2009-04-09
  • 打赏
  • 举报
回复
不需要方法有返回值,也就是void也是可以的,你通过out.print("xxx");
这句话就相当于返回你想要的内容了,不需要return了。
你向服务器端发送和接受数据,都是通过AJAX的XmlHttpReuqest对象进行的
所以,在此之前,你需要找个AJAX的小例子来看看
l_dongdong 2009-04-09
  • 打赏
  • 举报
回复
感谢两位的耐心讲解gzwlj 、donghusoft

楼上的方法返回值还是void啊(public void doPost)

这个没有返回值 只是单单的out.println回显在客户端呢,客户端怎么取值呢?



gzwlj 您好
按照您说的 我可以这样理解吗
String a ;
if(username==null || "".equals(username)) {
// out.print("用户名不能为空");
a = "用户名不能为空";
} else if(username.length()>10 || username.length()<3) {
// out.print("3到10个字符");
a = "3到10个字符";
}
写到这里我有写不下去了,呵呵,本来想写return a;了 但是上面还是void没有返回值啊??
Aajx可以取得没有返回值的方法的内容吗?

flowersove 2009-04-09
  • 打赏
  • 举报
回复
var verifyCode = " <%=session.getAttribute("verifyCode")%>";
这一句不对吧
建议用Ajax
donghusoft 2009-04-09
  • 打赏
  • 举报
回复
一样的说的没有错,对于验证码的验证,应该采用服务器端的验证,面不是应该采用客户端的验证,我们应该也考虑到这些安全性的问题.我有这里有一个简单的servlet的验证:
package iss;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {

/** */
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

HttpSession session = request.getSession();
//randomCode指的是生成的验证码;
String randomCode = (String) session.getAttribute("randomCode");
if (null == randomCode) {
response.sendRedirect("login.html");
return;
}
String reqRandom = request.getParameter("random");
response.setCharacterEncoding("gbk");
response.setContentType("text/htmlcharset=gb2312");
PrintWriter out = response.getWriter();
if (randomCode.equals(reqRandom)) {
response.sendRedirect(request.getContextPath()+"/index.jsp?result=1");
} else {
out.println("验证码不匹配!");
}
out.flush();
out.close();
}

}
gzwlj 2009-04-09
  • 打赏
  • 举报
回复
out.print()是服务器返回到客户端的值,你需要在客户端通过回调方法接收这个返回的值,并显示到页面上,
比如这样的回调方法
function callBack() {
if(xhr.readyState==4) {
if(xhr.status==200) {
message = "message="+xhr.responseText
alert(message);
}
}
}

其中xhr.responseText就是可以取得服务器返回的值

JS这堆是属于AJAX的东西了,楼主不熟悉,可以先看看AJAX的相关内容,并不多。
l_dongdong 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzwlj 的回复:]
对于验证码的验证,应该采用服务器端验证,而不应该采用客户端验证,因为如果你的验证码已经发送到客户端,那么一些别有用心的用户同样可以轻松的或得验证码,所以你的验证码也就失去了该用的作用,因此,你第一个思路是不可行的。
你第2个思路是服务器端验证,这是正确的,现在也流行AJAX的方式进行验证,就是通过JS获取用户输入值,通过XmlHttpRequest对象将值传递一服务器的一个Servlet进行比较处理,处理完成后,可以通过P…
[/Quote]
您好,感谢您的回答
但是我怎么来实现JS效果呢,您说的这个 out.print()只是现实在页面上吧,我想要实现innerHTML这个方法的效果啊,在输入框的后面提示。我的其他验证输入是否合法的JS都是这样的效果
谢谢
gzwlj 2009-04-09
  • 打赏
  • 举报
回复
对于验证码的验证,应该采用服务器端验证,而不应该采用客户端验证,因为如果你的验证码已经发送到客户端,那么一些别有用心的用户同样可以轻松的或得验证码,所以你的验证码也就失去了该用的作用,因此,你第一个思路是不可行的。
你第2个思路是服务器端验证,这是正确的,现在也流行AJAX的方式进行验证,就是通过JS获取用户输入值,通过XmlHttpRequest对象将值传递一服务器的一个Servlet进行比较处理,处理完成后,可以通过PrintWriter out = response.getWriter();然后out.println("验证码正确");等等将值写回客户端,你再通过AJAX的回调方法,把处理的结果输出到页面上即可。
至于doGet和doPost不是必须的,如果非要这样,你可以在doGet里调用doPost,反过来也可以。这里给你一个我写的Servlet的例子,希望对你有帮助
package ajax;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CheckUser extends HttpServlet {

protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

PrintWriter out = response.getWriter();

String username = request.getParameter("username");
if(username==null || "".equals(username)) {
out.print("用户名不能为空");
} else if(username.length()>10 || username.length()<3) {
out.print("3到10个字符");
}
}
}

81,091

社区成员

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

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