`
alone_knight
  • 浏览: 122276 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Session生命周期讨论

阅读更多

文章级别:Java初级    预备技能点:JSP内置对象, 监听器, 序列化

          在程序开发的时候, request session appplication内置对象, 是用的比较多的. request和appliction比较简单, 一个代表一次请求的生命周期. 另一个代表应用程序的生命周期. 多说一点application是单态模式. 在任何地方打印application内置对象,得到的是同一个地址. 因此可以存储程序的公共变量,而非个人的公共变量(个人的公共变量 例如登录信息) 应该存储到Session中
          今天我就详细讲解下中间那个兄弟. 因为在网上看到很多文章. 几乎毫无例外的说. 一个浏览器只有一个Session, 浏览器关闭Session就消失了.其实这种方法是不正确的.
          要了解Session首先要知道一个概念:Session的销毁只有两种情况:第一:session调用了 session.invalidate()方法. 第二:前后两次请求超出了session指定的生命周期时间. 其中Session的生命周期时间可以在web.xml配置. 默认30分钟 在web.xml可以做如下配置:
<session-config>
      <session-timeout>5</session-timeout>
</session-config>
        如何来证明关闭浏览器的时候Session没有销毁呢?  我们可以创建一个SessionListener 此监听器专门用来监听Session的生命周期的.代码如下:


 
别忘记在web.xml中配置监听器, 配置完毕后 可以做个测试. 当浏览器关闭后此监听器的 sessionDestroyed方法并没有执行,而是在5分钟左右(个人电脑没有那么精确) 才会触发sessionDestroyed ,当然 再打开浏览器的时候 sessionCreated 会自动调用 关闭5分钟后sessionDestroyed 又会自动调用, 通过getID方法大家可以判断是否为同一个Session. 所以网上说明的关闭浏览器Session就消失.其实并不正确. 如果没有任何配置的情况下. 关闭浏览器30分钟后Session才会消失的.
        我们可以利用这个概念做什么呢? 最典型的就是利用 SessionListener  的sessionDestroyed方法 来记录用户非正常退出的时间. 用户在访问某个网站的时候(目前的银行网站都有此功能) 显示了用户的最后登录时间. 此时间如何获取. 在这里分两种情况
        如果用户按"退出" 按钮那就好说了. 跳转到action中.记录下用户退出的时间. 存储到持久层中
        如果用户非正常退出, 在没有配置Session的情况下 默认会在30分钟后调用sessionDestroyed 那么我们同样可以在此获取用户退出的时间,在sessionDestroyed 调用业务逻辑完成我们想要实现的功能
 
有关Session第2个典型的应用就是Session中存储了用户的登录信息. 那么就可以访问用户权限的一些页面.
       有关这个应用要注意一个问题: 存储到session中的 User对象一定要实现Serializable接口. Serializable的作用可以参考相关资料.正常情况下当我们做测试的时候关闭Tomcat 大家会在  Tomcat安装目录\work\Catalina\localhost\项目名 文件夹下面看到有一个 SESSIONS.ser 的文件.


 
此文件就是Session在Tomcat停止的时候 持久化到硬盘中的文件. 所有当前访问的用户Session都存储到此文件中. Tomcat启动成功后.SESSIONS.ser  又会反序列化到内存中,所以启动成功后此文件就消失了. 所以正常情况下 从启Tomcat用户是不需要登录的. 注意有个前提.就是存储到Session里面的user对象所对应的User类必须要序列化才可以
  • 大小: 71.9 KB
  • 大小: 47.1 KB
分享到:
评论
5 楼 ASD1185240511 2016-08-04  
307622798 写道
好像你说的有点错误,session机制是这样的,当服务器端需要为客户端的请求创建一个session的时候,先会检查请求中是否含有session id 如果包含的话,那么就从服务器内存中取出该session,但此时如果服务器中没有该session时会新建一个session,它的session id应该就是发送过来的请求中的session id。所以说即使session id一样不代表是同一个session,也有可能是新建的。因为session创建时的session id是会发送给客户端进行保存的,一般是存放在cookie中,如果客户端的cookie是设置了失效时间的话,那么即使会话结束,cookie还是会保存在本地硬盘上的。所以你再次打开浏览器cookie里面可能还有session id,但服务器端的session已经不存在了,所以会新建一个。
我是这样理解的,也不知道对不对,还请多多指教!

sessionid会有重复?
4 楼 307622798 2014-09-17  
好像你说的有点错误,session机制是这样的,当服务器端需要为客户端的请求创建一个session的时候,先会检查请求中是否含有session id 如果包含的话,那么就从服务器内存中取出该session,但此时如果服务器中没有该session时会新建一个session,它的session id应该就是发送过来的请求中的session id。所以说即使session id一样不代表是同一个session,也有可能是新建的。因为session创建时的session id是会发送给客户端进行保存的,一般是存放在cookie中,如果客户端的cookie是设置了失效时间的话,那么即使会话结束,cookie还是会保存在本地硬盘上的。所以你再次打开浏览器cookie里面可能还有session id,但服务器端的session已经不存在了,所以会新建一个。
我是这样理解的,也不知道对不对,还请多多指教!
3 楼 eric110 2013-08-14  
讲的很不错,
2 楼 Flyaway_921 2013-03-23  
很透彻
1 楼 hngmduyi 2012-09-20  
嗯。学习了。

相关推荐

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    在Spring框架中,Bean的生命周期管理和作用域是其核心特性之一,它们对于理解Spring如何管理对象的创建、初始化、使用以及销毁至关重要。首先,我们来深入探讨Bean的生命周期。 Spring中的Bean生命周期主要分为两个...

    详解php设置session(过期、失效、有效期)

    在PHP中,Session是一种非常重要的会话管理机制,它允许开发者在用户的不同页面请求之间保持状态。...通过正确配置和编程技巧,开发者可以有效地控制Session的生命周期,从而优化用户体验和服务器资源管理。

    Session

    可能涵盖了Session的生命周期、存储方式(如内存、数据库、文件系统)、Session劫持和Session固定攻击的防范措施等内容。 标签"源码"提示我们,这篇博客可能还涉及到了Session实现的内部代码或开源库的源码分析,这...

    c#实现cookie和session的登陆实例

    - 设置适当的Cookie和Session生命周期,防止长期有效的登录令牌被滥用。 6. **最佳实践**: - 考虑使用更现代的身份验证机制,如JWT(JSON Web Tokens),它们可以提供更安全、更灵活的用户认证方案。 通过以上...

    session过期时间设置

    通过编程、配置文件或应用服务器配置,我们可以灵活地调整Session的生命周期,并利用监听器在Session失效后执行相应操作,如控制在线用户数、防止多处登录等。理解并正确运用这些技术,有助于构建更加健壮和安全的...

    ext session失效 页面跳转

    在后端,开发者需要设置Session的生命周期和超时策略。这通常可以通过配置服务器的Session管理模块来完成,比如在PHP中设置`session.cookie_lifetime`和`session.gc_maxlifetime`,或者在Java的Servlet容器中配置...

    session.rar

    3. **Session的生命周期**:可能讨论了Session的有效时间(默认值通常为20分钟),以及如何自定义Session的超时时间。 4. **Session管理**:如何处理多个并发用户,避免Session冲突,以及在服务器集群中的Session...

    session机制与cookie机制(来源于IT168)

    在Java Web开发中,`javax.servlet.http.HttpSession`接口代表了一个session,它提供了创建、获取和移除session属性的方法,以及管理session生命周期的功能。开发者可以使用这个接口来实现服务器端的用户状态跟踪。 ...

    session共享

    6. **过期策略**:为了保持Redis中的Session与实际应用中的Session生命周期一致,我们需要设置Redis中Session的过期时间,这可以通过设置Redis的TTL(Time To Live)属性来实现。 7. **安全性考虑**:在使用Redis...

    HUIHUA.rar_session

    - session有其生命周期,一般默认是30分钟,即如果在30分钟内没有收到客户端发送的带有session ID的请求,服务器会自动销毁该session。 - 开发者可以调整session的生命周期,以适应不同的应用场景。例如,对于需要...

    WebLogic之Session

    2. **生命周期管理**:WebLogic为每个Session分配了一个默认的超时时间,过了这个时间,Session将被自动销毁,释放其占用的资源。管理员可以在WebLogic管理控制台中更改此超时时间。 3. **Session复制**:在...

    深入理解session,cookie

    然而,Session也有生命周期,服务器默认会话会话空闲一段时间后自动失效。这个时间间隔可以通过`&lt;session-config&gt;`标签在web.xml中配置。此外,`HttpSession`对象提供了`setMaxInactiveInterval(int interval)`方法...

    HttpModule检验Session值

    在本场景中,我们将讨论如何利用HttpModule来检验Session值和Cookie值,以实现在项目中的身份验证功能。 首先,我们需要了解HttpModule的工作原理。当一个HTTP请求到达服务器时,IIS会调用已注册的HttpModule集合中...

    asp.net的session和cookie的应用

    因此,合理地使用和配置Session生命周期是非常重要的。 接下来,我们讨论Cookie。Cookie是由Web服务器发送到用户的浏览器并存储在本地的一小段文本信息,用于跟踪用户状态。与Session不同,Cookie存储在客户端,这...

    分布式Session的一个实现.

    为了提高性能,还可以使用Redis的过期时间功能,为每个Session设置一个合理的生命周期,避免内存资源的浪费。 另一种常见的解决方案是使用Spring Session框架。Spring Session提供了一种透明的方式,将Session数据...

    Session Bean的使用

    3. 容器管理:EJB容器提供了事务管理、安全性、生命周期管理和资源管理等服务,开发者无需关心这些底层细节。 4. 可部署和可扩展性:Session Bean可以在不同的服务器上部署,易于扩展和调整以适应不断变化的需求。 ...

    osgi session共享 支持springmvc 配置个filter即可

    ServiceTracker可以帮助我们在运行时自动检测到其他Bundle对Session共享的需求,而DS则可以简化服务的生命周期管理。 在实际应用中,我们还需要注意安全性问题,确保只有授权的服务才能访问和修改Session数据。这...

    Meteor Session demo

    5. **生命周期**:Session 变量的生命周期与用户的浏览器会话相同,一旦用户关闭浏览器,Session 数据将丢失。 6. **示例代码**:博客中可能包含了一些演示如何在实际应用中使用Session的代码片段,如登录状态的...

    EJB3.0开发Session Bean.rar

    - **Singleton Session Bean**:整个应用生命周期中只有一个实例,常用于全局配置或计数器。 **4. 注解驱动的开发** EJB 3.0引入了多种注解,如`@Stateless`, `@Stateful`, `@Singleton`, `@LocalBean`, `@Remote`...

    SharePreference类似于JavaEE中的session

    虽然SharePreferences和session都用于存储数据,但它们的使用场景和生命周期管理有很大区别。SharePreferences适用于本地数据的持久化,而session则专注于网络会话状态的维护。在Android开发中,如果需要临时存储...

Global site tag (gtag.js) - Google Analytics