现象1:
当登陆以后,如果继续刷新页面,次数还会不断的增加。
现象2:
如果后退,那么会显示出登陆框。此时刷新,会显示登陆信息。
//tile.jsp
<%
boolean isFlag = false;
isFlag = "1".equals(session.getAttribute("flag"));
%>
<%
if(isFlag)
{
//显示登陆用户相关信息
%>
欢迎光临,<%=session.getAttribute("uname")%>,您是第
<%=session.getAttribute("ucount")%>次登陆,您上次登陆
的时间是<%=session.getAttribute("utime")%>。
<%
}
else
{
//显示登陆框,然后跳转到login页判断
%>
<form action="login.jsp" method="get">
用户名:<input type="text" name="name">
密码:<input type="password" name="password">
<input type="submit" value="登陆">
</form>
<%
}
%>
//login.jsp
<jsp:useBean id="ab" class="pro.one.Demo" scope="request">
<jsp:setProperty name="ab" property="*"/>
</jsp:useBean>
<html>
<body>
<%
/* String str1 = request.getParameter("name");
String str2 = request.getParameter("password");
Demo aa = new Demo();
ab.setName(str1);
ab.setPassword(str2);
*/
String tt = null;
int count = 0;
boolean flag = false;
LogDB ldb = new LogDB();
ldb.setDemo(ab);//获得bean
DBConnection dbc = new DBConnection();
ldb.setDBConnection(dbc);//获得连接
flag = ldb.isExist();//判断帐号和密码正确是否正确
%>
<%
if(flag==true)
{
//帐号和密码正确
//上一次登陆的时间及次数
session.setAttribute("flag","1");
tt = ldb.getUserLastTime();
count = ldb.getCount();
session.setAttribute("uname", ab.getName());
session.setAttribute("utime",tt);
session.setAttribute("ucount",String.valueOf(count));
//将当前的时间放入数据库中,将获取到的次数加1放入到数据库中
count++;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
ldb.setUserLastTime(sdf.format(new Date()));
ldb.setCount(count);
ldb.update();
%>
<jsp:forward page="title.jsp"/>
<%
}
else
{
//帐号和密码正确,转到错误页
// ldb.user.getName();
out.print(ldb.user.getName());
out.print("<br>");
out.print(ldb.user.getPassword());
}
%>
原因:
当表单提交后,如果账号和密码正确,服务器会将title.jsp中的内容读取出来,发送到login.jsp,显示出登陆信息。
页面仍在title.jsp,如果这时候刷新(“刷新也就是一次request请求”),那么会再次执行title.jsp中的内容(count++等),因此,如果继续刷新页面,次数还会不断的增加。
“后退”是将上次的页面(title.jsp)原封不动的再显示出来,所以后退后会显示登陆框;如果刷新,那么会再次执行title.jsp中的内容,判断 isFlag = "1".equals(session.getAttribute("flag"))时,由于flag的值为“1”,所以isFlag为真,所以显示出登陆信息。
另注意:
如果login.jsp中Bean的scope设为request,情况不会发生任何改变。因为在第一次登陆时(无论是否成功),都会实例化 一个范围为request的对象ab存放在pageContent中。
若登陆成功后刷新页面,顺序执行到代码:
<jsp:useBean id="ab" class="pro.one.Demo" scope="request">
<jsp:setProperty name="ab" property="*"/>
</jsp:useBean>
时,服务器首先会检查pageContent中在request范围内是否有ab实例对象,发现有,则不会再创建新的ab;而<jsp:setProperty name="ab" property="*"/>只有在bean第一次实例化时才创建,所以它也不会执行。(所以这里要注意uesBean在JSP页面加载过程是怎样的,以及jsp:setProperty赋值时的要求)