本章目标
掌握session的主要作用
掌握session的常用操作方法
session对象
在前面讲解四种属性范围的时候,已经为读者介绍了session对象的使用,实际上在开发中session对象最主要的用处就是完成用户的登陆(login)、注销(logout)等常见功能的,每一个session对象都表示不同的访问用户,session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用在HTTP协议中。
HttpSession接口的主要方法
取得Session Id
当一个用户连接到服务器之后,服务器会自动为此session自动分配一个不会重复的Session Id,服务器依靠这些不同的Session Id来区分每一个不同的用户,在WEB中可以使用HttpSession接口中的getId()方法取得这些编号。
取得Session Id
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>取得Session Id</title>
</head>
<body>
<%
String id=session.getId();//取得Session Id
%>
<h3>SESSION ID:<%=id %></h3>
<h3>SESSION ID长度:<%=id.length() %></h3>
</body>
</html>
效果图:
通过序列化的方式保存session
在Tomcat中可以通过配置server.xml文件,将每一个用户的session在服务器关闭时序列化到存储介质(存储介质可以是文件或数据库)上保存,这样即使服务器重新启动了,也可以通过反序列化的方式,从指定的存储介质上反序列化session。
配置server.xml文件,加入session保存操作
<Context path="/mldn" docBase="D:\mldnwebdemo">
<Manager className="org.apache.catalina.session.PersistentManager">
debug=0 saveOnRestart="true"
maxActiveSession="-1" minIdleSwap="-1"
maxIdleSwap="-1" maxIdleBackup="-1"
<Store className="org.apache.catalina.session.FileStore" directory="d:\temp"/>
</Manager>
</Context>
属性作用:
className:session的管理器操作类,Tomcat通过此接口完成序列化管理;
debug:Session管理器的跟踪级别;
saveOnRestart:配置服务器重新启动前对session的处理,可以配置true或false两中选项,如果为true则会在容器关闭前将有效的session保存,重新启动后重新载入;
maxActiveSession:可以活动的session的最大数,如果设置为-1,则表示不受限制,超过最大限制会将session对象转移到Session Store中;
minIdleSwap:一个session不活动的最短时间,单位为秒,如果设置为-1,则表示不受限制,超过该时间会将session对象转移到Session Store中;
maxidleSwap:一个session不活动的最长时间,单位为秒,如果设置为-1,则表示不受限制,超过该时间会将session对象转移到Session Store中,该session不在内存中保存;
maxidleBackup:session的最长时间,单位为秒,如果设置为-1,则表示不受限制,超过该时间会将session对象备份到Session Store之中,但该Session对象依然存在于内存之中。
<Store>元素:定义实现持久化session的操作类及指定的文件存放位置,本程序将序列化的session保存在了“d:\temp”文件夹之中,每一个保存的session都是通过文件保存的,文件的命名规范是“sessionid.session”。
登陆及注销
在各个的系统中几乎都会包括用户登陆验证及注销的功能,那么此功能就完全可以使用session实现,具体的思路是:当用户登陆成功之后,设置一个session范围的属性,之后在其他需要验证的页面中判断是否存在此session范围的属性,如果存在,则表示已经是正常登陆过的合法用户,如果不存在,则给出提示,并跳转回登陆页提示用户重新登陆,用户登陆之后可以进行注销的操作。
程序列表
编写表单并执行验证
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>编写表单并执行验证</title>
</head>
<body>
<form action="login.jsp" method="post">
用户名:<input type="text" name="uname"><br />
密 码:<input type="password" name="upass"><br />
<input type="submit" value="登录">
<input type="submit" value="重置">
</form>
<%
String name=request.getParameter("uname");//取得name的信息
String password=request.getParameter("upass");//取得password的信息
if(!(name==null||"".equals(name)||password==null||"".equals(password))){//进行用户名和密码的验证
if("chaoyi".equals(name)&&"123456".equals(password)){
response.setHeader("refresh", "2;URL=welcome.jsp");//定时跳转
session.setAttribute("userid", name);//将登录的用户名保存在session中
%>
<h3>用户登陆成功,两秒后跳转到欢迎页!</h3>
<h3>如果没有跳转,请按<a href="welcome.jsp">这里</a></h3>
<%
}else{//登录失败给出的错误信息
%>
<h3>错误的用户名或密码!</h3>
<%
}
}
%>
</body>
</html>
效果图:
欢迎页
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>欢迎页</title>
</head>
<body>
<%
if(session.getAttribute("userid")!=null){//已经设置过属性,所以不为空
%>
<h3>欢迎<%=session.getAttribute("userid") %>光临本系统,<a href="logout.jsp">注销</a>!</h3>
<%
}else{//非法用户,没有登录过,则session范围没有属性存在
%>
<h3>请先进行系统的<a href="login.jsp">登录</a>!</h3>
<%
}
%>
</body>
</html>
效果图:
登录注销
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>登录注销</title>
</head>
<body>
<%
response.setHeader("refresh", "2;URL=login.jsp");//定时跳转
session.invalidate();//注销
%>
<h3>你已成功退出本系统,两秒后跳转回首页了!</h3>
<h3>如果没有跳转,请按<a href="login.jsp">这里</a></h3>
</body>
</html>
效果图:
判断是否是新的用户
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>登录注销</title>
</head>
<body>
<%
if(session.isNew()){//用户是第一次访问
%>
<h3>欢迎新用户光临!</h3>
<%
}else{//用户再次访问页面
%>
<h3>您已经是老用户了!</h3>
<%
}
%>
</body>
</html>
效果图:
取得用户的操作时间
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%
long start=session.getCreationTime();//取得创建时间
long end=session.getLastAccessedTime();//取得最后一次操作时间
long time=(end - start)/1000;//得出操作的秒
%>
<h3>你已经停留了<%=time %>秒!</h3>
效果图:
小结
session对象最主要的功能就是用于登陆验证操作
当用户第一次连接到服务器上时会自动分配一个新的session id