java中的Session

本文详细解释了Session的概念、机制、创建和删除方式及其在解决HTTP协议无状态问题中的作用。了解Session如何通过Cookie在客户端和服务器间传递,以及其生命周期管理。

一、什么是session?

    session称为“会话控制”,Session 对象存储特定用户会话所需的属性及配置信息。

二、session的机制是什么?

     当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端是否包含一个session标识(即JSESSIONID)。

     如果是第一次请求服务器,服务器会创建session,并创建Cookie,在Cookie中保存Session的id,发送给客户端,这样客户端就有了自己的session的id了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId。

    如果是第二次请求服务器,会在请求中把保存的sessionId的Cookie发送给服务器,服务器通过sessionId查找session对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象。这样也就可以让多个请求共享同一个session了。

    当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId,那么服务器会创建一个session,再把sessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效(默认保留时间为30分钟)。

    当用户打开某个服务器页面长时间没动作时,这样session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到session对象了,那么服务器还是会创建一个新的session对象,再把新的sessionId保存到客户端。这也是一个新的会话开始了。

三、怎样创建和删除session?

   创建session:

//创建session
HttpSession session = request.getSession();

    删除session:

//删除session
session.invalidate();

     当 距离上次收到客户端发送的session id 时间间隔超过了session的最大有效时间(默认30分钟)也会被删除。

     服务器进程停止也会被删除。

四、session有什么作用?

       session是用来解决Http协议不能维持状态的问题。session只存储在服务器端的,不会在网络中进行传输,所以session是相对安全的。session是依赖cookie的,当用户访问某一站点时,服务器会为这个用户产生唯一的session_id,并把这个session_id以cookie的形式发送到客户端,以后的客户端的所有请求都会自动携带这个cookie。

### JavaSession的基本概念用法 #### 1. Session的基本概念 Session 是一种用于在服务器端存储用户会话数据的技术。每个用户与服务器交互时,都会生成一个唯一的 Session ID,客户端通过这个 ID 来标识自己的会话。Session 数据存储在服务器端,因此客户端无法直接访问这些数据,这使得它适合存储敏感信息,例如用户的登录状态或购物车内容[^2]。 当用户首次访问服务器时,服务器会创建一个新的 Session,并为该用户分配一个唯一的 Session ID。此 ID 通常通过 Cookie 或 URL 重写的方式传递给客户端。如果一定时间内客户端没有与服务器进行交互,Session 将因超时而失效,其默认超时时间在 Tomcat 中为 120 分钟,但可以通过 `HttpSession` 的 `setMaxInactiveInterval` 方法调整[^3]。 #### 2. Session的生命周期 Session 的生命周期从用户第一次访问服务器开始,到以下任一条件满足时结束: - 用户明确调用了 `invalidate()` 方法销毁 Session。 - 超过了设置的最大非活动间隔(默认为 120 分钟)。 - 服务器重启(某些情况下,Session 数据可能会被持久化并恢复,但这取决于具体实现)[^4]。 需要注意的是,浏览器关闭并不会自动通知服务器结束会话,因此服务器通常依赖于超时机制来清理不再活跃的 Session[^3]。 #### 3. Session的基本使用方法 以下是使用 JavaSession 的基本步骤: - **获取 Session 对象**:通过 `HttpServletRequest` 的 `getSession()` 方法获取当前请求对应的 Session。如果当前请求没有关联的 Session,则会创建一个新的 Session。 - **存储数据**:使用 `setAttribute(String name, Object value)` 方法将数据存储到 Session 中。 - **获取数据**:使用 `getAttribute(String name)` 方法从 Session 中检索数据。 - **销毁 Session**:调用 `invalidate()` 方法销毁当前 Session。 以下是一个简单的代码示例,展示了如何使用 Session 存储检索数据: ```java // 获取 Session 对象 HttpSession session = request.getSession(); // 存储数据到 Session session.setAttribute("username", "JohnDoe"); // 从 Session 中获取数据 String username = (String) session.getAttribute("username"); // 设置 Session 的最大非活动间隔(单位:秒) session.setMaxInactiveInterval(60 * 30); // 30 分钟 // 销毁 Session session.invalidate(); ``` #### 4. Session与Cookie的区别 虽然 Session Cookie 都可以用于维护用户会话状态,但它们有显著的区别: - **存储位置**:Session 数据存储在服务器端,而 Cookie 数据存储在客户端。 - **安全性**:由于 Session 数据存储在服务器端,因此更安全,适合存储敏感信息。而 Cookie 数据存储在客户端,容易被篡改或窃取。 - **持久性**:Cookie 可以设置过期时间,从而实现长期存储,而 Session 数据通常在会话结束后失效[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值