前言
对于当时刚开始接触到这两个概念的我来说,这两个东西是非常模糊的,当然,这样也和我自己 Java 基础不牢固有关,导致在学习 Java Web 的过程中,埋下了许多地雷。现如今,从新梳理下,希望能给屏幕前的你带来收获。
Session 的概念
Session 是 Web 应用程序中的一种会话管理机制,用于存储和维护用户的会话状态。
那问题来了,什么是「会话」?
当用户访问 Web 应用时,服务器会创建一个唯一的会话 ID,并将其存储在用户的浏览器中的 Cookie 中。在接下来的请求中,浏览器会将会话 ID 作为参数发送给服务器,以便服务器可以识别用户并将其请求与之前的请求相关联。
为什么会有 Session?
HTTP 协议是无状态的,当用户在网站中进行多次请求,服务器并不能判断这些请求是不是来自同一用户,所以出现了一种技术,这种技术称为「会话跟踪技术」。
而 Session 就是其中一种会话跟踪技术,当然,后面说的 Cookie 也是。
Session 的原理
Session 的原理是基于服务器端的存储和管理,因此相对来说比较安全。在用户访问 Web 应用程序时,服务器会为每个用户创建一个唯一的 Session ID,服务器会将 Session ID 和对应的会话状态存储在内存或者数据库中,同时也返回一份 Session ID 给浏览器,让浏览器存储在 Cookie 中,并在一定时间内保持有效。当用户进行后续的请求时,服务器会根据 Session ID 来识别用户,并获取和维护用户的会话状态。最后,当用户关闭浏览器或者超过一定时间没有活动时,服务器会自动销毁对应的 Session。
- 存储在服务器端,需要占用服务器资源(比如内存资源)
- 失效时间短,一般只有数分钟或数小时
- 难以跨域共享,不同域名的服务器无法共享 Session
代码如何写?
那服务器这边是怎样去存储和管理的呢?代码是怎样写的呢?
在Servlet API中,HttpSession 由 Servlet容器(比如 Tomcat)创建,它可以存储任意的 Java 对象,我们可以通过 setAttribute(
方法将对象绑定到 Session 中,之后通过 getAttribute(
方法获取绑定在 Session 中的对象。
- 获取 Session 对象
我们可以通过 HttpServletRequest 的 getSession( 方法来获取 HttpSession 对象。如果 HttpSession 对象不存在,则会创建一个新的 Session 对象。
Session 常用方法
setAttribute(String name, Object value
:将一个名为 name,值为 value 的对象绑定到 Session 中。
getAttribute(String name:获取 Session 中绑定的名为 name 的对象。
removeAttribute(String name:从 Session 中删除名为 name 的对象。
getId(:获取 Session 的唯一标识符。
getCreationTime(:获取 Session 的创建时间。
getLastAccessedTime(:获取 Session 的最后访问时间。
setMaxInactiveInterval(int interval:设置 Session 的最大不活动时间间隔,单位为秒。
getMaxInactiveInterval(:获取 Session 的最大不活动时间间隔。
SessionServlet
:@WebServlet(name = "SessionServlet", urlPatterns = "/session" public class SessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp throws ServletException, IOException { // 获取 Session 对象 HttpSession session = req.getSession(; // 将用户名存储到 Se