IE中ajax+jsp登录界面,由于缓存导致jsp过滤器与ajax请求被拦截的问题和解决

分类: java web java web 2011-11-22 14:10 316人阅读 评论(0) 收藏 举报
 学习javaweb过程中一个灰常奇怪的问题
jsp+ajax做了个登陆界面,但是一个用户只能登陆一次,在登录就跳转不过去了!
后台servlet:
[java] view plaincopyprint?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); 
        } 

 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);
         }
 
更奇怪的是,虽然以后登录sysout打印没出来,但是if里面的判断结果却返回给了页面!
javascript:
[javascript] view plaincopyprint?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"; 
        } 
    } 

 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:
[java] view plaincopyprint?HttpSession session = request.getSession();//获取session  
        session.removeAttribute("usernum");//清除字段  
        request.getRequestDispatcher("/login.jsp").forward(request,//清除后转入登陆页面  
                response); 

HttpSession session = request.getSession();//获取session
        session.removeAttribute("usernum");//清除字段
        request.getRequestDispatcher("/login.jsp").forward(request,//清除后转入登陆页面
                response);
还有两个过滤器:
第一个是为了防止未登录的用户进入,过滤的除了login之外的页面:
[java] view plaincopyprint?HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
        HttpSession session = httpServletRequest.getSession();//获取session  
        if(session.getAttribute("usernum")  == null)//判断session是否空  
        {     
            request.getRequestDispatcher("/login.jsp").forward(request, response);//如果空,则没登陆,转入登录界面  
            return; 
        } 

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpSession session = httpServletRequest.getSession();//获取session
        if(session.getAttribute("usernum")  == null)//判断session是否空
        {   
            request.getRequestDispatcher("/login.jsp").forward(request, response);//如果空,则没登陆,转入登录界面
            return;
        }
第二个是为了防止登录用户再进入登陆页面,只过滤login页面:[java] view plaincopyprint?HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
        HttpSession session = httpServletRequest.getSession();// 取得session  
        if (session.getAttribute("usernum") != null)// 判断session是否为空  
        { 
            request.getRequestDispatcher("/view/index.jsp").forward(request, 
                    response);// 非空,则已经登录,转入主页  
            return; 
        } 

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上有什么差异? 我用了一个折中的方法:
js中跳转改为跳到一个中间的servlet: [javascript] view plaincopyprint?window.location.href = "${pageContext.request.contextPath }/loginbridge.do?usernum="+usernum; 

window.location.href = "${pageContext.request.contextPath }/loginbridge.do?usernum="+usernum;然后在这个servlet中setsession。这样就可以解决登录的问题,但是那个打印语句依然没有出现。 终于在大家的提醒下,是缓存问题没有解决。登陆的url两次一样的话Ajax不会访问服务器。 于是将js方法改成如下,给url加上时间戳:[javascript] view plaincopyprint?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); 

    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);
    }
于是原因找到,问题得到解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值