模块简述:做一个登录验证,由于开始的框架是ssh2,最开始只是初步搭建起页面,当要实现登录验证(验证用户名密码是否错误、验证用户名密码框是否为空)的时候,选择了ajax在前台向后台传递数据,然后通过action来进行验证用户为空(返回null,因为ajax和struts2结合,不能刷新页面,刚好我判断的是用户不存在的情况下,由AJAX向前台返回out.print(),再通过回调函数来alert)问题描述:一切都没有问题,唯一一个疑惑百思不得其解,当我netUser 验证不为null的时候,可以return “success”,进入主菜单,但是为什么我用if限制了条件,netUser 已经不为null了,但是还是会alert一下,才进入主页面,一下为代码:
public String execute() throws IOException {

Net_User netUser = netUserService.autheication(username, password);//验证方法


HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html; charset=utf-8");
//response.setHeader("Cache-Control", "no-cache");// 清除缓存
//response.addHeader("pragma", "no-cache"); 
//response.addHeader("cache-control", "no-cache,must-revalidate"); 
//response.addHeader("expires", "0"); 

String username_test =ServletActionContext.getRequest().getParameter( "username");
String password_test =ServletActionContext.getRequest().getParameter( "password");
PrintWriter out = null;
out = response.getWriter();

if (netUser == null && (username_test !="" ) &&( password_test  !="" )){
//response.setHeader("Cache-Control", "no-cache");// 清除缓存
System.out.println(netUser);
out.print(1); //这里出现问题,当我netUser 不为空,还是会alert
return null;

}else if ((netUser == null && username_test == ""&& password_test !="") ||(netUser == null && password_test == ""&& username_test !="") ||(netUser == null && username_test == ""&& password_test =="")) {
//response.setHeader("Cache-Control", "no-cache");// 清除缓存
out.print(2);
return null;

}

response.setHeader("Cache-Control", "no-cache");// 清除缓存
ServletActionContext.getRequest().getSession().setAttribute("user",
netUser);
String test = netUser.getProvince();
String test1 = netUser.getCity();
String test2 = netUser.getDistrict();
String test3 = netUser.getStreet();
String test4 = netUser.getStreetname();
String test5 = netUser.getSerialnumber();
String test6 = netUser.getPower();
System.out.println(test + "," + test1 + "," + test2 + "," + test3 + ","
+ test4 + "," + test5 + "," + test6);
System.out.println("good !"); return "success";//这里出现问题,当我netUser 不为空,还是会alert,对应上面的条件

}
var xmlHttp;function createXmlHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}function ver() {
//1:创建XMLHttpRequest对象
createXmlHttpRequest();
//2:取出要传递的值
var username = document.getElementById("username").value;
var url = "login.action?action=loginAction&username=" + username
+ "&timestamp=" + new Date().getTime(); //3:建立与Servlet连接 (传递的方式,传递的URL,是否异步)
xmlHttp.open("GET", url, true);
//4:建立回调函数
xmlHttp.onreadystatechange = function() { callback(); };
//5:传递
xmlHttp.send(null);
}
function callback() {
var c = xmlHttp.responseText;
//alert(c);
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
alert(c);
if (c == 1) {
alert("用户名或密码错误!");
} else if (c == 2) { alert("请填写用户名或密码!");
} else {
alert("");
} } else {
alert("页面错误,请联系管理员!")
} }
求大侠给看看哪里的逻辑出现错误了,谢啦!
strutsajaxxmlhttprequest

解决方案 »

  1.   

    if (xmlHttp.status == 200) {
                alert(c);这里的alert在作怪
      

  2.   


    我去掉试试,那个是为了验证下是否取到值,有时候取到的是整个页面的值,就因为action return 的值不是null.
      

  3.   


    还是一样, 明明是return success了, 还是给我 alert用户名或密码错误,
    我怀疑是缓存之类的,蛋疼啊,求答案求答案!
      

  4.   

    验证成功就会进入这个判断if (xmlHttp.status == 200) {
    当然会alert(c)l 
      

  5.   

    xmlHttp.open("GET", url, true); 改成xmlHttp.open("GET", url, false);试试 
      

  6.   


    关键问题不是他alert ,alert 是我测试返回的接受值,如果action中的if alert没有问题,
    但是如果我返回给action的netUser为null的话,说明我的netUser不为空, 那么应该直接return success ,刷新页面,直接进入我struts.xml里配置的return success 进入main.jsp啊
      

  7.   

    是1  action的第一个if是1  
     
    return success   也为1 
      

  8.   

    不行,false之后还是会alert  而且                                 alert("用户名或密码错误!");
     window.location.href="index.jsp"; 这段代码也不跳转了 。
      

  9.   

    if (xmlHttp.status == 200) {
                alert(c);
                if (c == 1) {
                    alert("用户名或密码错误!");
                } 你不是开玩笑嘛?return success 后c为1,当然会进去
     if (c == 1) {
                    alert("用户名或密码错误!");
                } 
    了,这有什么疑问的。
    你的意思应该是
     if (c != 1) {
                    alert("用户名或密码错误!");
                } 
      

  10.   

             
            if (netUser == null && (username_test !="" ) &&( password_test  !="" )){
                //response.setHeader("Cache-Control", "no-cache");// 清除缓存
                System.out.println(netUser);
                out.print(1); //这里出现问题,当我netUser 不为空,还是会alert
                return null;
                 
            }else if ((netUser == null && username_test == ""&& password_test !="") ||(netUser == null && password_test == ""&& username_test !="") ||(netUser == null && username_test == ""&& password_test =="")) {
                //response.setHeader("Cache-Control", "no-cache");// 清除缓存
                out.print(2);
                return null;
                 
            }    
             这里的 1 和 2 是 netUser为null 的情况,既然netUser 为空,怎么会return success   还是我理解错误?
      

  11.   

    netUser 不为空说明用户存在,根本不会进去IF, 但是为何还会取到 这个1呢,想不通啊
      

  12.   


    这两个IF都是以netUser为null为前提的, ajax真是个神奇的玩意
      

  13.   

    if (netUser == null && (username_test !="" ) &&( password_test  !="" )){
    netUser不为空,username_test 和password_test  是否都为true?这里是个且的关系。
      

  14.   

    我大概说下我的思路,首先action进入数据库给我返回了一个netUser,只有两种可能,这个netUser 可能是null,也可能是数据库的某个存在的记录;那我的两个if条件,是以这个用户不存在为前提,所以  netUser == null &  后面加上相应的条件来判断输入的值为空或者是密码用户名错误之类的, 因为既然用户不存在,我们只需要判断文本框传来的值即可了,在返回回调函数,执行相应的提示, 如果netUser 不是空的,返回的是一条记录的话,那么显然会直接return success ,ajax遇到刷新页面,不会执行,请指点我的思路或者是那个地方犯了一个惯性的错误
      

  15.   


    这样解决不了你的问题吗?
    怎么写那么麻烦if (netUser != null&&!"".equals(netUser)){
       if(netUser.equals(数据库里的用户名)&&password.equals(数据库里对应的密码)){
        return success;
       }
    return null;
    }
      

  16.   

    感觉lz代码写得有点凌乱啊
    ServletActionContext.getRequest().getParameter( "username");
    既然用struts,为什么还这样获得请求参数?
    struts有一个validate方法来提供你验证的