2008年8月17日 0:25
上一篇文章转载了《Cookie和Session专题
》,读了以后发现自己很多地方真的很白,里面的第14条:
十四、session什么时候被创建
*************************************************************************************
一个常见的错误是以为 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 生成。
那么我以前一直错误地认为当某个Client端请求开始时,Session就创建了,此后Session就一直存在直到过期,而request在当前Client的一系列请求操作中有可能销毁和新建,所以Session的生命周期要比request长。现在看来这么想大错特错了,Session和Request的生命周期根本就是火星和地球,拿来相比是没有任何意义的。好像是在问鲨鱼和老虎PK谁会赢,没有意义的问题. . .
想起研究Session和Cookie是因为单位最近一个项目在做登录系统时遇到些问题,类似单点登录、Session过期、客户信息安全、Cookie使用等,下一片想些这些,我想到了3到4种方案,选择哪一种犹豫不定,因为我是个初学者,写出来是想让大家多给提提意见。特此感谢!
分享到:
相关推荐
在 Java Web 应用中,可以通过 `HttpSession` 接口中的 `getLastAccessedTime()` 和 `getCreationTime()` 方法来获取用户交互间隔和 Session 创建时间。 #### 4.1 获取用户交互间隔 - **`getCreationTime()`**:...
- **添加商品:** 当用户点击“加入购物车”按钮时,JSP页面会获取商品信息,创建一个JavaBean对象,并将它放入Session。如果Session中已经存在该商品,那么就更新数量。 - **显示购物车:** 用户可以查看购物车中...
6. 取得用户最后一次操作的时间: 方法:`public long getLastAccessedTime()`, 用户在线时间 = Session 最后一次操作时间 - Session 创建时间。 Session 与 Cookie 的区别 Session 将信息保存在服务器上,而 ...
通过这种方式,每当Session创建或销毁时,相应的回调方法会被调用,从而允许我们对Session的生命周期进行控制和管理。 总结来说,Session过期时间的设置是一项关键的安全和性能优化措施。通过编程、配置文件或应用...
- **统计在线用户**:通过监听Session创建和销毁,可以实时统计网站上的在线用户数量。 - **资源释放**:在Session销毁时,可以清理与之关联的数据库连接或其他资源。 - **安全控制**:检测长时间未活动的Session...
当用户首次访问网站时,服务器会为该用户创建一个唯一的Session ID,并将其存储在服务器的内存中。这个ID随后通过Cookie或者URL重写等方式返回给客户端。每次客户端请求服务器时,都会携带这个Session ID,服务器...
在本文中,我们主要探讨了在使用Spring Session以及Redis作为存储方式时,由于消息监听导致创建大量线程的问题及其解决方案。我们将从Spring Session的基础知识、Redis在Spring Session中的作用、监听机制导致线程...
5. **自定义session存储处理**:如果以上方法仍无法满足需求,可以考虑自定义session存储处理器,通过实现`session_set_save_handler()`函数来自行管理session的创建、读取、写入和销毁过程,从而更好地控制session...
首先,`Session` 对象的创建通常发生在用户第一次访问受保护的资源时。服务器通过 `HttpServletRequest` 对象的 `getSession()` 方法来创建一个新的 `HttpSession` 实例。如果当前会话不存在,该方法会创建一个新的...
每个用户访问网站时,服务器都会为该用户创建一个唯一的会话标识(session ID),通过这个标识可以在多次请求之间共享数据。系统session和报表session是两个独立的概念,它们在Web服务器下共存时,不会发生冲突,...
3. **Session监听器**:通过实现HttpSessionListener或HttpSessionAttributeListener接口,可以在Session创建、销毁或属性变化时执行特定操作。 4. **及时清理Session**:为了避免内存泄漏,开发者应合理设计...
Session监听器是Servlet API提供的一种机制,允许开发者对Session的生命周期事件进行监听和处理,比如Session创建、更新、失效等。下面,我们将深入探讨Session监听及其在实际应用中的作用。 首先,我们需要了解...
销毁Session通常有两种方式:一是通过编程方式调用session.invalidate()方法,二是服务器设置的Session超时时间到达,服务器会自动清理过期的Session。 3. **Session的存储** Session数据存储在服务器的内存中,...
// 获取当前Session的创建时间 long sessionCreationTime = session.getLastAccessedTime(); // 设置的Session过期时间为30分钟 long sessionTimeout = 30 * 60 * 1000; // 单位为毫秒 if ((System....
此外,还可以自定义Session的启动方式,例如创建一个名为`start_session`的函数,它可以接受期望的过期时间作为参数: ```php function start_session($expire = 0) { if ($expire == 0) { $expire = ini_get('...
通常,开发者会设置一个会话超时时间,超过这个时间未收到客户端的请求,服务器将自动清除对应的Session数据。 2. **Session存储**:Session信息可以存储在内存、数据库或专门的Session存储服务中。在内存中存储...
3. **Cookie与Session结合**:服务器可以在创建Session时同时设置一个与Session关联的Cookie,Cookie的过期时间略长于Session。每次客户端请求时,如果Cookie存在但Session已过期,服务器可以根据Cookie重新创建...
1. **Session创建与更新**:当用户请求到达服务器时,如果创建或更新Session,Tomcat-Redis-Session-Manager会将Session对象序列化为字节数组,然后存储到Redis中,键为服务器生成的唯一Session ID。 2. **Session...
然后创建一个配置类,如`SessionConfig`,配置RedisSessionRepository,并启用Spring Session。 ```java @Configuration @EnableRedisHttpSession public class SessionConfig { @Bean public ...
JavaWeb中的Session技术是Web开发中的重要概念,主要用于在服务器端保持用户状态,尤其是在用户登录后,实现用户在一段时间内的自动登录功能。本篇将详细解释Session的工作原理、配置及其实现用户自动登录的机制。 ...