jsp+ajax做了个登陆界面,但是一个用户只能登陆一次,在登录就跳转不过去了!
后台servlet:
HttpSession httpSession = request.getSession();
String usernumString = request.getParameter("usernum");// 获取输入的用户名
String passwordString = request.getParameter("password");// 获取输入的密码
response.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = response.getWriter();
System.out.println("-----");//第一次用这个用户可以登录并正常显示和跳转,第二次和以后在用这个账户就根本不出现打印语句了
if (!LoginCheck.check(usernumString, passwordString)) {// 检查用户名密码,匹配数据库
printWriter.println("密码错误");
} else {
printWriter.println("");
httpSession.setAttribute("usernum", usernumString);
}[code]
更奇怪的是,虽然以后登录sysout打印没出来,但是if里面的判断结果却返回给了页面!
javascript:
[code=JScript]function check() {
var jqueryObj1=$("#usernum");
var usernum=jqueryObj1.val();
var jqueryObj2=$("#password");
var password=jqueryObj2.val();
alert(usernum+"+"+password);
$.get("${pageContext.request.contextPath }/login.do?usernum=" + usernum
+ "&password=" + password, null, checkback);
}
function checkback(data) {
alert(data.length);
alert(data);
if (data.length==6) {
var resultObj = $("#result2");
resultObj.html(data);
} else {
window.location.href = "${pageContext.request.contextPath }/view/index.jsp";
}
}
登陆后的注销servlet:
HttpSession session = request.getSession();//获取session
session.removeAttribute("usernum");//清除字段
request.getRequestDispatcher("/login.jsp").forward(request,//清除后转入登陆页面
response);
问题:1.用一个新的用户可以正常登录,后台打印语句也可以打印。
      2.注销后再用这个账户登录,url显示跳转到了这个页面,但是页面没有改变,打印语句不执行。
      3.注销后用错误信息登录,打印语句也不执行,但是错误信息可以返回给js。
      4.以上为ie9+jquery1.6 。firefox下一切正常!!
。。愁死了

解决方案 »

  1.   

    还有两个过滤器:
    第一个是为了防止未登录的用户进入,过滤的除了login之外的页面:
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpSession session = httpServletRequest.getSession();//获取session
    if(session.getAttribute("usernum")  == null)//判断session是否空
    {
    request.getRequestDispatcher("/login.jsp").forward(request, response);//如果空,则没登陆,转入登录界面
    return;
    }
    第二个是为了防止登录用户再进入登陆页面,只过滤login页面:
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpSession session = httpServletRequest.getSession();// 取得session
    if (session.getAttribute("usernum") != null)// 判断session是否为空
    {
    request.getRequestDispatcher("/view/index.jsp").forward(request,
    response);// 非空,则已经登录,转入主页
    return;
    }把两个过滤器删掉就没事了。
    但是还是那个问题,firefox下不删也没问题。是不是两个浏览器关于session清除和set上有什么差异?
      

  2.   

    我用了一个折中的方法:
    js中跳转改为跳到一个中间的servlet:
    window.location.href = "${pageContext.request.contextPath }/loginbridge.do?usernum="+usernum;
    然后在这个servlet中setsession。这样就可以解决登录的问题,但是那个打印语句依然没有出现。
      

  3.   

    就一个检查登录状态的过滤器,删掉就好了。也就是说,根本原因是session里没有放进去值,我用sysout打出也是null。就是带打印“---”那个servlet中的代码没有执行。奇怪的是,那个servlet中下面if里面判断的结果却能返回给页面。
      

  4.   

    我用你的代码试了下,不知道为什么老是说我的页面语法错误,firebug中的报错信息
      

  5.   

    有没有执行你调试一下就知道了。。还有你session注销是怎么实现的?
      

  6.   

    我用火狐跑完全正常,firebug里也没报错。就是ie不行。
      

  7.   

    也调试过了,确实没执行。HttpSession session = request.getSession();//获取session
            session.removeAttribute("usernum");//清除字段
            request.getRequestDispatcher("/login.jsp").forward(request,//清除后转入登陆页面
                    response);
      

  8.   

    语法错误可能是你没导入jquery.js?
      

  9.   


    导入了,纠结死,还好公司今天没事做,就是因为jquery的问题,我之前的JSP都可以,就是这个不行算了,我大概看了下,你把过滤器中的forward的请求改成
    request.getRequestDispatcher("/login.jsp").forward(
    httpServletRequest, httpServletResponse);// 如果空,则没登陆,转入登录界面利用httpServletRequest和httpServletResponse跳转试试
      

  10.   

    我怀疑是不是你跳转的问题。。下列路径对?
    window.location.href = "${pageContext.request.contextPath }/view/index.jsp";
    request.getRequestDispatcher("/login.jsp").forward(request, response);
    request.getRequestDispatcher("/view/index.jsp").forward(request,response);if (session.getAttribute("usernum") != null)// 判断session是否为空
            {
                request.getRequestDispatcher("/view/index.jsp").forward(request,
                        response);// 非空,则已经登录,转入主页
                return;  // 去掉return
            } return你写在那里干嘛的? return空了。。可能导致上面的没有返回跳转servlet很久没用过了。也不能太确定
      

  11.   

    试了下,不是这个。我原来login页没用ajax,这些都能用,今天改了下改毁了。。我先用个中间页面跳转凑合着。慢慢再研究这个问题
      

  12.   

    路径没问题,那个return习惯了。。留不留没啥关系的。删了也没用,因为他不是没跳转,而是session为空,进不去if
      

  13.   

    个人觉得,去掉return就可以了,上面的语句就是跳转的语句,不需要return
      

  14.   


    我这边测试OK了,在IE9和火狐上都测试了
    可能和你的代码有点偏差,应该就是过滤器的问题,因为过滤器拦截了你的servlet请求,所以导致你的页面跳转问题我也习惯写return用户登录过滤
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    HttpSession session = httpServletRequest.getSession();// 获取session
    if (session.getAttribute("usernum") == null)// 判断session是否空
    {
    if ( !httpServletRequest.getRequestURI().contains("userLogin") 
    && !httpServletRequest.getRequestURI().contains(".js")
    && !httpServletRequest.getRequestURI().contains("login")
    ) {
    request.getRequestDispatcher("/login-csdn.jsp").forward(
    httpServletRequest, httpServletResponse);// 如果空,则没登陆,转入登录界面
    return;
    }
    }
    chain.doFilter(request, response);
    return;
    已经登录过滤
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpSession session = httpServletRequest.getSession();// 取得session
            if (session.getAttribute("usernum") != null)// 判断session是否为空
            {
             if (!httpServletRequest.getRequestURI().contains("login")){
                request.getRequestDispatcher("/login-csdn1.jsp").forward(request,
                        response);// 非空,则已经登录,转入主页
                return;
             }
            }
    chain.doFilter(request, response);
    return;
      

  15.   

    应该是缓存吧,url后面加个时间戳
      

  16.   


    这个就是原因吧,你登陆的url两次一样的话Ajax不会访问服务器.
      

  17.   

    注销了以后就不要forword了吧。。直接重定向不是更好??
      

  18.   

    嗯,确实是过滤器的问题,这样改的话可以跳转,但是过滤器的作用就失灵了。楼上两位说的是原因,因为请求的url没变,导致了没连接服务器直接缓存的,缓存里session又给remove了,所以导致被过滤器阻挡。
    function check() {
    var jqueryObj1=$("#usernum");
    var usernum=jqueryObj1.val();
    var jqueryObj2=$("#password");
    var password=jqueryObj2.val();
    $.get("${pageContext.request.contextPath }/login.do?time="+new Date().getTime()+"&usernum=" + usernum
    + "&password=" + password, null, checkback);
    }
    js方法改成这样,加上时间戳就好了。
    谢谢你一起讨论哈~
    这个问题算是解决了,是我刚学ajax,不是很了解这个机制
      

  19.   

    一语中的!感谢提醒!
    Quote=引用 20 楼 xinlan1022 的回复:]
    应该是缓存吧,url后面加个时间戳
    [/Quote]