一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet )调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
*************************************************************************************
我一开始还不信,做个试验我信了。
一开始不信是因为,用 FireFox 测试清空了Cookie ,只要一跑一个jsp ,马上会看到生成了一个名字是 JSESSIONID 的Cookie ,注意这个是 Session Cookie (会话Cookie),不是 Persistent Cookie (持久Cookie),这个《Cookie和Session专题 》一文中讲的很明白,会话 Cookie 是为实现 session 机制而采用的在 Client 端与 Server 端之间保持状态的解决方案之一,在默认情况下是保存在 Client 端内存中的。注意:会话 Cookie 的“会话”这里不是指 Server 端的 Session ,而是指的是浏览器,所以会话 Cookie 的生命周期不是与 Server 端的 Session 那个会话相同,而是与浏览器相同,就是说只要开着浏览器会话 Cookie 就存在,关闭浏览器它就过期了。但是会话 Cookie 的值是与 Server 端的 SessionId 对应相同的。就是说会话Cookie随着Server端Session的创建而创建,但并不随着Session的过期而过期,而是随着Client端的浏览器关闭而销毁。 这说明只要会话Cookie 出现了,Server 端的 Session 就已经创建了。
我一开始的错误想法是:我的 jsp 里没有 HttpServletRequest.getSession(true) 的代码阿,但是 JSESSIONID 的Cookie 出现了就说明 Server 端 Session 创建了,这与《Cookie和Session专题 》上面讲的不符啊,不过马上想通了,jsp 属于动态页,本质就是一个 Servlet ,编译后的 jsp 是要到 Server 端进行交互的(即便 jsp 里没写一句交互的代码),因为 jsp 里有内置对象,内置对象就是和 Server 交互的产物,所以如果你的首页是个 jsp 页的话,即便没有HttpServletRequest.getSession(true),Session 也会创建。
如果首页是*.html 就不同了,再将 FireFox 的 Cookie 都清除了,将首页设置为 index.html, 回车,查看,果然这次没有JSESSIONID 的 Cookie 生成,这说明Server的Session也没有创建,让 index.html 提交到一个Servlet, 确实可以证明没有 HttpServletRequest.getSession(true) ,Sesion是不会创建的, 即便Servlet又转发(或者重定向)到第二个页,只要第二个页依然不是jsp页,Session就依然不会创建,FireFox 当然也没有名字为 JSESSIONID 的 Cookie 生成。
相关推荐
首先,`Session` 对象的创建通常发生在用户第一次访问受保护的资源时。服务器通过 `HttpServletRequest` 对象的 `getSession()` 方法来创建一个新的 `HttpSession` 实例。如果当前会话不存在,该方法会创建一个新的...
在本文中,我们主要探讨了在使用Spring Session以及Redis作为存储方式时,由于消息监听导致创建大量线程的问题及其解决方案。我们将从Spring Session的基础知识、Redis在Spring Session中的作用、监听机制导致线程...
当用户首次访问网站时,服务器会为该用户创建一个唯一的Session ID,并将其存储在服务器的内存中。这个ID随后通过Cookie或者URL重写等方式返回给客户端。每次客户端请求服务器时,都会携带这个Session ID,服务器...
- **统计在线用户**:通过监听Session创建和销毁,可以实时统计网站上的在线用户数量。 - **资源释放**:在Session销毁时,可以清理与之关联的数据库连接或其他资源。 - **安全控制**:检测长时间未活动的Session...
如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...
每个用户访问网站时,服务器都会为该用户创建一个唯一的会话标识(session ID),通过这个标识可以在多次请求之间共享数据。系统session和报表session是两个独立的概念,它们在Web服务器下共存时,不会发生冲突,...
Session的工作原理是,当用户访问服务器并进行登录或其他需要记录状态的操作时,服务器会在内存中创建一个唯一的Session ID,并将其发送给浏览器。这个Session ID通常以Cookie的形式存储在客户端。之后,每当客户端...
首先,我们需要理解什么是Session。在Web应用中,每当用户打开一个网站并进行交互时,服务器都会为这个用户创建一个唯一的Session ID,这个ID会通过Cookie或者URL重写等方式返回给客户端。当用户再次发送请求时,...
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
Session 对象是一个 JSP 内置对象,它在第一个 JSP 页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。 Session 对象的 Id ...
#### 3.1 什么是 Session 持久化 Session 持久化是指将 Session 数据从内存中持久化到硬盘或者其他持久化存储中,这样即使服务器重启,Session 信息也不会丢失。这对于提高系统的可用性和用户体验非常重要。 #### ...
当用户访问某个网站时,服务器会为该用户创建一个Session对象,并为这个Session分配一个唯一的标识符(通常是一个Session ID)。 - **作用**:Session主要用于跨页面保持用户的状态信息,比如用户的登录状态等。 ##...
首先,理解什么是Hibernate Session。Session是Hibernate中的核心接口,它充当了应用程序和数据库之间的桥梁,负责对象的持久化操作,如保存、更新、删除和查询等。Session通常在一个事务中打开并在事务结束时关闭,...
Session监听器是Servlet API提供的一种机制,允许开发者对Session的生命周期事件进行监听和处理,比如Session创建、更新、失效等。下面,我们将深入探讨Session监听及其在实际应用中的作用。 首先,我们需要了解...
当用户访问网站时,服务器会为每个用户创建一个唯一的Session ID,并将其通过Cookie返回给浏览器。之后,浏览器在每次发送请求时都会带上这个Session ID,服务器根据ID找到对应的Session数据。 在JavaScript中,...
这个Session ID随后会被发送到客户端(通常是通过Cookie),客户端在后续的每次请求时都会携带这个Session ID。服务器通过检查这个ID来识别出特定的用户,从而获取并维护用户的会话信息,如登录状态、购物车内容等。...
通常,当服务器首次接收到包含session ID的请求,或者首次调用`getSession()`方法且当前没有活动session时,session会被创建。 2. session 何时被删除 session可能在以下情况被删除: - 用户关闭浏览器,浏览器...
这涉及到创建一个新的类来实现`System.Web.SessionState.SessionStateStoreProviderBase`接口,并重写其中的一些方法以满足特定的需求。这种方式更为复杂,但在某些场景下可能更为有效。 4. **检查浏览器设置**: ...
当Session被废弃或过期时,监听器的`sessionDestroyed()`方法会被调用。这可以用来实现自动清理过期Session的功能。以下是一个简单的Session监听器示例: ```java @WebListener public class SessionListener ...