学习javaweb过程中一个灰常奇怪的问题
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);
}
更奇怪的是,虽然以后登录sysout打印没出来,但是if里面的判断结果却返回给了页面!
javascript:
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);
还有两个过滤器:
第一个是为了防止未登录的用户进入,过滤的除了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上有什么差异?
我用了一个折中的方法: js中跳转改为跳到一个中间的servlet:
window.location.href = "${pageContext.request.contextPath }/loginbridge.do?usernum="+usernum;
然后在这个servlet中setsession。这样就可以解决登录的问题,但是那个打印语句依然没有出现。
终于在大家的提醒下,是缓存问题没有解决。登陆的url两次一样的话Ajax不会访问服务器。
于是将js方法改成如下,给url加上时间戳:
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);
}
于是原因找到,问题得到解决!