会话跟踪技术
会话跟踪技术是一种在 Web 应用程序中跟踪用户会话状态的机制,它允许服务器在多个请求之间识别和关联属于同一用户的请求,以便在整个会话过程中保持用户相关的信息。以下是几种常见的会话跟踪技术:
Cookie
- 概念:Cookie 是服务器发送到用户浏览器并保存在本地的一小段数据,以键值对形式存储。浏览器后续向同一服务器发起请求时,会自动在请求头中携带这些 Cookie 数据。
- 原理:用户访问服务器时,服务器在响应头中通过
Set-Cookie
字段向浏览器发送 Cookie。浏览器接收后将其存储在本地。之后浏览器每次向该服务器发送请求时,会在请求头的Cookie
字段中带上这些 Cookie 信息,服务器据此识别用户状态。- 应用场景:用于记录用户偏好、实现自动登录、跟踪用户行为等。
Session
- 概念:Session 是服务器端用于跟踪用户会话的机制。服务器为每个用户创建一个唯一的 Session 对象,用于存储该用户在整个会话期间的相关数据。
- 原理:用户首次访问服务器时,服务器为其创建一个唯一的 Session ID,并通过响应头中的
Set-Cookie
将该 ID 发送给浏览器,浏览器将其存储在本地的 Cookie 中。后续请求时,浏览器会在请求头的Cookie
字段中带上这个 Session ID,服务器根据该 ID 查找对应的 Session 对象,获取和更新用户相关数据。- 应用场景:常用于用户认证与授权、购物车功能、多页面表单数据传递等场景。
URL 重写
- 概念:通过在 URL 中附加会话相关的信息,如 Session ID,来跟踪用户会话。当用户访问一个页面时,服务器将包含 Session ID 的新 URL 返回给浏览器,浏览器在后续请求中使用这个带有 Session ID 的 URL,服务器就可以根据 URL 中的 Session ID 来识别用户会话。
- 原理:服务器在生成页面的链接时,将 Session ID 作为参数附加到 URL 后面。用户点击链接时,浏览器将包含 Session ID 的 URL 发送给服务器,服务器从 URL 中解析出 Session ID,从而确定用户的会话。
- 应用场景:当浏览器禁用了 Cookie 时,可以作为替代方案来实现会话跟踪。不过,由于 URL 中携带了会话信息,可能会存在一定的安全风险,且在某些情况下可能会导致 URL 过长。
隐藏表单域
- 概念:在 HTML 表单中添加一个隐藏的输入字段,用于存储会话相关的信息,如 Session ID。当表单提交时,这个隐藏字段的值也会被发送到服务器,服务器可以根据这个值来跟踪用户会话。
- 原理:服务器在生成 HTML 页面时,在表单中插入一个隐藏的输入字段,并将 Session ID 等会话信息作为该字段的值。用户提交表单时,浏览器将表单数据包括隐藏字段的值一起发送给服务器,服务器从接收到的表单数据中获取隐藏字段的值,从而识别用户会话。
- 应用场景:同样可以在 Cookie 被禁用的情况下作为一种补充的会话跟踪方式,但它只能在表单提交时传递会话信息,对于其他类型的请求(如直接访问页面)则无法使用。
一、Cookie
1.概念介绍
Cookie 是服务器发送到用户浏览器并保存在本地的小段数据,它会在浏览器下次向同一服务器再发起请求时被携带上并发送到服务器上。这些数据可以帮助服务器识别用户身份、记录用户偏好等。
2.基本使用方法
设置 Cookie
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/setCookie") public class SetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 创建一个 Cookie 对象,键为 username,值为 JohnCookie cookie = new Cookie("username", "John");// 设置 Cookie 的有效期为 3600 秒(1 小时)cookie.setMaxAge(3600);// 将 Cookie 添加到响应中resp.addCookie(cookie);resp.getWriter().println("Cookie has been set.");} }
获取 Cookie
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/getCookie") public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求中的所有 CookieCookie[] cookies = req.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {resp.getWriter().println("Username from cookie: " + cookie.getValue());return;}}}resp.getWriter().println("No username cookie found.");} }
发送请求后控制台输出
3.原理
当客户端(浏览器)向服务器发送请求时,服务器可以在响应头中添加
Set - Cookie
字段,浏览器接收到响应后会将这些 Cookie 存储在本地。之后,浏览器每次向该服务器发送请求时,都会在请求头中包含Cookie
字段,将之前存储的 Cookie 信息发送给服务器,服务器根据这些信息进行相应处理。4.使用细节
- 有效期:可以通过
setMaxAge()
方法设置 Cookie 的有效期。正数表示多少秒后过期,负数表示浏览器关闭时过期,0 表示立即删除。- 作用域:可以通过
setPath
和setDomain
方法设置 Cookie 的作用路径和作用域名,只有在指定路径和域名下的请求才会携带该 Cookie。- 安全性:可以通过
setSecure
方法设置 Cookie 只能通过 HTTPS 协议传输,通过setHttpOnly
方法设置 Cookie 不能被 JavaScript 脚本访问,防止 XSS 攻击。- 存储中文:URL编码
5.应用场景
- 记录用户偏好:如网站的主题颜色、字体大小等设置。
- 实现自动登录:存储用户的登录凭证,下次访问时自动登录。
- 跟踪用户行为:记录用户浏览过的页面等信息,用于分析用户行为。
二、Session
1.概念介绍
Session 是服务器端的会话机制,服务器会为每个客户端(浏览器)创建一个唯一的 Session 对象,用于存储该客户端在整个会话期间的相关数据。客户端通过一个唯一的 Session ID 来与服务器的 Session 对象进行关联。
2.基本使用方法
创建并使用 Session
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; import java.io.IOException;@WebServlet("/createSession") public class CreateSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取当前请求的 Session,如果不存在则创建一个新的HttpSession session = req.getSession(true);// 向 Session 中存储一个属性session.setAttribute("userRole", "admin");resp.getWriter().println("Session has been created and attribute set.");} }
获取 Session 中的数据
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; import java.io.IOException;@WebServlet("/getSession") public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取当前请求的 Session,如果不存在则返回 nullHttpSession session = req.getSession(false);if (session != null) {// 从 Session 中获取属性String userRole = (String) session.getAttribute("userRole");if (userRole != null) {resp.getWriter().println("User role from session: " + userRole);} else {resp.getWriter().println("No user role attribute found in session.");}} else {resp.getWriter().println("No session found.");}} }
3.原理
当客户端第一次访问服务器时,服务器会创建一个新的 Session 对象,并为其生成一个唯一的 Session ID。服务器会将这个 Session ID 通过
Set - Cookie
响应头发送给客户端,客户端将其存储在本地的 Cookie 中。之后客户端每次请求时,都会将这个 Session ID 包含在请求头的Cookie
字段中发送给服务器,服务器根据这个 Session ID 找到对应的 Session 对象,从而获取和更新会话数据。4.使用细节
- 活化、钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中(钝化),再次启动服务器后,从文件中加载数据到Session中(活化)。二者保证了服务器重启前后,数据的持久化。应用场景:购物车信息持久留存。
- 存储位置:Session 数据默认存储在服务器的内存中,但也可以配置存储在数据库或文件系统中,以支持分布式环境。
- 过期时间:可以通过
setMaxInactiveInterval
方法设置 Session 的最大不活动时间,超过这个时间 Session 会自动失效。或者设置如下图依赖。- 销毁:可以通过
invalidate
方法手动销毁 Session。该方法可应用于用户退出登录5.应用场景
- 用户认证与授权:存储用户的登录状态和权限信息,在用户访问受保护资源时进行验证。
- 购物车功能:将用户添加到购物车的商品信息存储在 Session 中,方便用户在购物过程中操作。
- 多页面表单数据传递:在用户填写多个页面的表单时,将中间数据存储在 Session 中,最后一起处理。
三、Cookie 和 Session 的区别
存储位置
- Cookie:数据存储在客户端(浏览器)。
- Session:数据存储在服务器端。
安全性
- Cookie:由于存储在客户端,容易被篡改或窃取,安全性较低。但可以通过设置安全属性(如
secure
和HttpOnly
)提高安全性。- Session:数据存储在服务器端,相对安全。但如果 Session ID 泄露,可能会被攻击者利用。
存储容量
- Cookie:单个 Cookie 通常限制在 4KB 左右,每个域名下的 Cookie 数量也有限制。
- Session:存储容量主要取决于服务器的配置,理论上可以存储更多的数据。
生命周期
- Cookie:可以通过设置
setMaxAge
方法控制有效期,分为会话期 Cookie(浏览器关闭时失效)和持久化 Cookie(指定过期时间)。- Session:可以通过
setMaxInactiveInterval
方法设置最大不活动时间,超过时间自动失效,也可以手动销毁。应用场景侧重点
- Cookie:更适合存储一些不太敏感的用户偏好信息,方便在不同页面之间共享。
- Session:主要用于存储用户的会话状态和敏感信息,如登录状态、权限等。