Servlet session跟踪
1.什么是session
Session 对象存储特定用户会话所需的属性及配置信息。
一般情况下,session都是存储在服务器内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。
2.Tomcat中session的工作原理
(1) session 的产生,存放
当浏览器访问服务器时,服务器使用HttpServletRequest的getSession(true)的取得浏览器cookies中的sessionid时,如果没有session对象,也就是浏览器第一次访问服务器,服务器就会生成一个session对象。tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。
(2)session 作用
当用户浏览器cookies中有sessionid的时候,服务器就可以从HttpServletRequest 类对象得到 sessionid,从而查找服务器中的session对象得到用户浏览器的session信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
3.Servlet中与session相关的方法
序号 | 方法 |
1 | public void setAttribute(String name,Object value)将value对象以name名称绑定到会话 |
2 | public object getAttribute(String name)取得name的属性值,如果属性不存在则返回null |
3 | public void removeAttribute(String name)从会话中删除name属性,如果不存在不会执行,也不会抛处错误. |
3 | public Enumeration getAttributeNames()返回和会话有关的枚举值 |
4 | public void invalidate()使会话失效,同时删除属性对象 |
5 | public Boolean isNew()用于检测当前客户是否为新的会话 |
6 | public long getCreationTime()返回会话创建时间 |
7 | public long getLastAccessedTime()返回在会话时间内web容器接收到客户最后发出的请求的时间 |
8 | public int getMaxInactiveInterval()返回在会话期间内客户请求的最长时间为秒 |
9 | public void setMaxInactiveInterval(int seconds)允许客户客户请求的最长时间 |
10 | ServletContext getServletContext()返回当前会话的上下文环境,ServletContext对象可以使Servlet与web容器进行通信 |
11 | public String getId()返回会话期间的识别号 |
4.实例
这个实例模仿用户从第一访问,服务器为其设置session,到再次访问网站,服务器读取其session的过程。
package session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/Session")
public class Session extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession(true);
response.setContentType("text/html"); // 设置页面响应格式
HttpSession session = request.getSession(true); // (获取 or 生成)session对象
Date CreateTime = new Date(session.getCreationTime()); // 获取session生成时间
Date lastAccessTime = new Date(session.getLastAccessedTime()); //获取用户最后一次访问服务器的时间。
//设置几个key,value用来测试
Integer visitCount = 1;
String visitCounkey = "visitCount";
String userIDkey = "userID";
String userID = "qak";
String title = "Welcome Back";
if (session.isNew()) { //判断用户是否是第一次访问
title = "Welcome";
session.setAttribute(userIDkey, userID);
session.setAttribute(visitCounkey, visitCount);
} else {
visitCount = (Integer) session.getAttribute(visitCounkey);
visitCount += 1;
session.setAttribute(visitCounkey, visitCount);
}
PrintWriter out = response.getWriter(); // 获得输出流对象
out.println("<!DOCTYPE html>\r\n" +
"<html>\r\n" +
"<head>\r\n" +
"<meta charset=\"UTF-8\">\r\n" +
"<title>"+ title + "</title>\r\n" +
"</head>\r\n" +
"<body>\r\n" +
title+"<br /><br />"+
"<b>"+"sessionid : " + session.getId() +"<b />"+ "<br />"+
"CreateTime : " + CreateTime + "<br />" +
"lastAccessTime : " + lastAccessTime + "<br />" +
visitCounkey+ " : " + visitCount + "<br />" +
userIDkey + " : " + userID + "<br />" +
"</body>\r\n" +
"</html>");
//session.invalidate(); //删除session对象。
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
第一次访问结果:
第二次访问结果:
第八次访问结果:
5.删除session
当您完成了一个用户的 session 会话数据,您有以下几种选择:
(1)移除一个特定的属性:您可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。
(2)删除整个 session 会话:您可以调用 public void invalidate() 方法来丢弃整个 session 会话。
(3)设置 session 会话过期时间:您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。
(4) 注销用户:如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。
(5)web.xml 配置:如果您使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,标签中的时间以分钟为单位。