Session Tracking in Java

2025年5月7日 | 阅读6分钟

在Web的世界里,Session是指两个系统相互交互的时间段。这两个系统可以相互之间建立点对点或客户端-服务器关系。然而,问题在于,在HTTP协议中,通信的状态不会被维护,也就是说,HTTP是一个无状态协议。**Java中的Session跟踪**就是利用Servlet来解决这个问题的。

Cookies

为了在Java中实现Session跟踪,最常用的技术之一就是Cookies。 Cookies以键值对的形式包含信息。它由服务器发送到客户端的浏览器。它由浏览器保存在客户端系统中。然而,Cookies在跟踪Session方面效果不佳。Cookies的缺点是:

1) Cookies只能存储文本信息。

2) Cookies是浏览器相关的。因此,如果客户端禁用Cookies,Web应用程序将永远无法使用Cookies。

3) 单个Cookie不能包含大量信息。单个Cookie的大小不能超过4KB。

HttpSession接口

Java Servlet提供了HttpSession接口,该接口提供了一种在多个页面请求之间识别特定用户或保存有关该用户的信息的方法。事实上,Java Servlet使用HttpSession接口在HTTP服务器和HTTP客户端之间建立连接。

HttpSession接口方便Servlet能够

  • 操作和查看任何Session的信息,例如创建时间、Session标识符和最后访问时间。
  • 将对象绑定到Session,从而允许用户信息在多个连接中保持不变。

下图显示了HttpSession接口在Session中的工作原理。

Session Tracking in Java

用户A和用户B都请求连接到服务器。Servlet容器使用HttpSession接口通过为每个请求创建一个唯一的ID来连接到服务器。这个唯一的ID用于识别用户。这个唯一的ID可以存储在请求参数或Cookie中。

HttpSession接口的方法

方法名称描述
public HttpSession getSession(Boolean create)该方法获取与请求关联的Session。如果Session不存在,则方法根据作为参数传递给方法的布尔值create创建一个新Session。
public HttpSession getSession()如果Session已存在,则该方法返回该Session;否则,将创建一个新Session并返回。
public long getCreationTime()此方法返回创建Session的时间。
public String getId()该方法返回唯一的ID。
public long getLastAccessedTime()此方法返回最后一次访问Session的时间。
public boolean isNew()当客户端不希望加入Session,或者客户端对Session不熟悉时,该方法返回true;否则返回false。
void invalidate()该方法首先使Session失效,然后解除与Session关联的对象。

Java中Session跟踪的实现

以下程序展示了如何实现Session跟踪。在这个例子中,我们创建了四个文件。

1) index.html

2) web.xml

3) HTTPServletEx1.java

4) HTTPServletEx2.java

文件名: index.html

文件名: HTTPServletEx1.java

文件名: HTTPServletEx2.java

请按照以下步骤运行程序。

步骤 1: 安装Apache Tomcat应用程序。进入Tomcat应用程序的webapps文件夹,然后创建一个您喜欢的文件夹。我们创建了一个MyProject文件夹。

Session Tracking in Java

步骤 2: 在MyProject文件夹内创建一个WEB-INF文件夹,并在WEB-INF文件夹内创建一个classes文件夹。

步骤 3: 现在,使用javac命令编译上述Java文件。将生成的.class文件保存在classes文件夹中。

Session Tracking in Java

步骤 4: 现在,移到classes文件夹外部,并在WEB-INF文件夹中创建web.xml文件。请观察以下截图。

Session Tracking in Java

步骤 5: 将index.html文件放在WEB-INF文件夹旁边。

Session Tracking in Java

步骤 6: 我们的应用程序设置已准备就绪。现在,我们需要启动应用程序。为此,请导航到bin文件夹。

Session Tracking in Java

步骤 7: 在bin文件夹中,单击Tomcat10.exe

Session Tracking in Java

步骤 8: Apache Tomcat服务器已启动。Tomcat服务器通常监听端口号8090。因此,我们必须在URL中提供相同的端口号。为此,请转到浏览器并在URL栏中输入localhost:8090,然后按Enter键。您将看到以下内容。

Session Tracking in Java

步骤 9: 现在,将/MyProject添加到URL。因此,新的URL将是localhost:8090/MyProject。按下回车键后,index.html文件生效,并在浏览器上显示表单。

Session Tracking in Java

步骤 10: 现在输入您选择的名称,然后单击“Press the Button”,我们会得到以下结果。

Session Tracking in Java

步骤 11: 观察URL,它显示servletA。这是因为index.html文件中存在action属性。现在点击“Press Here”。

Session Tracking in Java

现在,我们移到了servletB。URL确认了这一点。这是因为HTTPServletEx1.java文件中存在锚标签。

解释: 在上面的代码中,getAttribute()和setAttribute()方法来自HttpSession接口。setAttribute()方法在第一个Servlet的Session范围内创建一个属性,而getAttribute()在第二个Servlet的Session范围内接收相同的属性。这就是为什么它同时在servletA和servletB中都能反映出来。

使用Servlet中的Http Sessions的优点

1) Session中可以存储各种对象,例如数据集、数据库和文本。

2) 与Cookies不同,在Session的使用中完全消除了对客户端浏览器的依赖。为了实现这一点,Session对象存储在服务器上,而不是客户端机器上。

3) Session是透明和安全的。

使用Servlet中的Http Sessions的缺点

1) Session对象存储在服务器端,这会导致性能开销。

2) 数据的反序列化或序列化也会带来性能开销。

注意: .java文件中的import语句包含jakarta一词。jakarta一词依赖于servlet-api.jar文件。在我们的例子中,当我们解压servlet-api.jar文件时,我们得到了jakarta文件夹。因此,我们在import语句中提到了jakarta。tomcat服务器的其他版本可能包含servlet-api.jar文件,解压后会显示javax文件夹。在这种情况下,导入语句中的词应该使用javax而不是jakarta。