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);
 }
}

第一次访问结果:

java开发session保存登录信息 java session存在哪里_java开发session保存登录信息


第二次访问结果:

java开发session保存登录信息 java session存在哪里_服务器_02


第八次访问结果:

java开发session保存登录信息 java session存在哪里_servlet_03


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 会话超时,标签中的时间以分钟为单位。