您的位置:首页 > Web前端 > JavaScript

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

2012-12-25 21:52 756 查看
分类: 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);

}

于是原因找到,问题得到解决!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐