一、Session对象
session对象最主要的用处就是完成用户的登录(login)、注销(logout)等常见功能的,每一个session对象都表示不同的访问用户,session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用在HTTP协议中。
二、HttpSession接口的主要方法
No. | 方法 | 类型 | 描述 |
1 | Public String getId() | 普通 | 取得SESSION ID |
2 | Public long getCreationTime() | 普通 | 取得SESSION的创建时间 |
3 | Public long getLastAccessedTime() | 普通 | 取得SESSION的最后一次操作时间 |
4 | Public boolean isNew | 普通 | 判断是否是新的SESSION(新用户) |
5 | Public void invalidate() | 普通 | 让SESSION失效 |
6 | Public Enumeration getAttributeNames() | 普通 | 得到全部属性的名称 |
三、Session ID
取得Session id
当一个用户连接到服务器之后,服务器会自动为此session自动分配一个不会重复的Session Id,服务器依靠这些不同的Session Id来区分每一个不同的用户,在WEB中可以使用HttpSession接口中的getId()方法取得这些编号。
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
String id = session.getId();
%>
<h3>SESSION ID:<%=id%></h3>
<h3>SESSION ID长度:<%=id.length()%></h3>
</body>
</html>
session在进行操作的时候使用到了cookie的处理机制 ,有一点必须说明的是,服务器关闭后,session id肯定需要重新分配,若想使服务器关闭后,session id也可以继续保留,那么就需要使用到了序列化的机制。
所谓的对象序列化指的是一个对象通过二进制保存或进行传输,而且对象所在的类必须实现java.io.Serializable接口,对于session本身也可以完成这种序列化的操作,但他不是手工完成的,而是需要自动配置完成,这个配置需要在server.xml中完成。
<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>
注:
配置中<Manager>元素是专门用来配置session管理操作的,该元素中每个属性的作用如下:
1.className:session的管理器操作类,Tomcat通过此接口完成序列化管理。
2.debug:session管理器的跟踪级别
3.saveOnRestart:配置服务器重新启动前对session的处理,可以配置true或false两种选项,如果为true则会在容器关闭前将有效的session保存,重新启动后重新载入。
4.maxActiveSession:可以活动的session的最大数。如果设置为-1,则表示不受限制,超过最大限制会将session对象转移到Session Store中。
5.minIdleSwap:一个session不活动的最短时间,单位为秒。如果设置为-1,则表示不受限制,超过该时间会将session对象转移到Session Store中。
6.maxIdleSwap:一个session不活动的最长时间,单位为秒。如果设置为-1,则表示不受限制,超过该时间会将session对象转移到Session Store中,该session不再内存中保存。
7.maxIdleBackup:session的最长时间,单位为秒。如果设置为-1,则表示不受限制,超过该时间会将session对象备份到Session Store中,但该session对象依然存在于内存中。
8.<Store>元素:定义实现持久化session的操作类及指定的文件存放位置。本程序将序列化的session保存在"d:\temp"文件夹中,每一个保存的session都是通过文件保存的,文件的命名规范是sessionid.session。
以上配置完成后,即使服务器中间关闭了,一个用户的session也可以通过此配置进行反序列化的恢复。
四、登录及注销
No. | 表达式 | 描述 |
1 | Login.jsp | 完成登录表单的显示,同时想页面本身进行数据提交,以完成登录的验证,如果登录成功(用户名和密码固定:Joywy/1111),则保存属性;如果登录失败,则显示登录失败的信息。 |
2 | Welome.jsp | 此页面要求在用户登录完成之后才可以显示登录成功的信息,如果没有登录,则要给出未登录的提示,同时给出一个登陆的连接地址。 |
3 | logout.jsp | 此功能完成登录的注销,注销之后,页面要跳转会login.jsp,等待用户继续登录。 |
<%@ page contentType="text/html" pageEncoding="GBK"%>
<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="reset" value="重置">
</form>
<%
String name = (String)request.getParameter("uname");
String password = (String)request.getParameter("upass");
if(!(name == null || "".equals(name) || password == null || "".equals(password))){
if("Joywy".equals(name) && "android".equals(password)){
//如果登录成功,则设置session的属性范围
session.setAttribute("userid", name);
response.setHeader("refresh", "2, URL=welcome.jsp");
%>
<h3>用户登录成功!两秒后跳转到欢迎页……</h3>
<h3>如果没有跳转,请按<a href="welcome.jsp">这里</a></h3>
<%
}else{
%>
<h3>错误的用户名或密码!</h3>
<%
}
}
%>
</body>
</html>
welcome.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<% //如果已经设置过了session属性,则肯定不为空
if(session.getAttribute("userid") != null){
%>
<h3>欢迎<%=session.getAttribute("userid")%>来到望星空<a href="logout.jsp">注销</a></h3>
<%
}else{
%>
<h3>请先进行本系统的<a href="login.jsp">登录</a></h3>
<%
}
%>
</body>
</html>
logout.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
response.setHeader("refresh", "2, URL=login.jsp");
session.invalidate(); //注销表示当前的session失效
%>
<h3>你已成功退出本系统,两秒后返回到首页!</h3>
<h3>如果没有跳转,请按<a href="login.jsp">这里</a></h3>
</body>
</html>
会话跟踪还有以下的四种技术:
1.通过session提供的保存
2.通过Cookie
3.通过表单的隐藏域完成
五、判断新用户:
在session的对象中可以使用isNew()方法判断一个用户是否是第一次访问页面
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
if(session.isNew()){
%>
<h3>欢迎新用户光临!</h3>
<%
}else{
%>
<h3>您已经是老用户了!</h3>
<%
}
%>
</body>
</html>
六、取得用户操作时间
如果要想取得一个session的具体的操作时间,可以通过计算方法取得。
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
long start = session.getCreationTime();
long end = session.getLastAccessedTime();
long time = (end - start) / 1000;
%>
<h3>您已经停留了<%=time%>秒</h3>
</body>
</html>