`
zuuuzhang
  • 浏览: 29253 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

j2ee session机制

 
阅读更多

      如何理解session机制,就让我们先从网络服务开始说起。目前网络服务主要分为两大类1)面向连接的服务2)面向无连接的服务。

      对于面向连接的服务,在计算机开始通信之前首先必须建立网络连接,待数据通信结束才撤销连接,因此只有服务端和一个客户端进行通信。这样不需要多次验证客户端信息,因为在服务器端第一次就进行了验证并记住验证。

      对无连接的服务,在通信之前并没有建立连接,并且在通信完成后,便断开联系,想要再次向服务器发送请求如何确定是来自同一客户端就是一个非常困难的问题。

      session机制,是一种服务端机制,当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

       解决方法有一下几种:

      1)使用Cookies保存客户端的信息;

          1隐私容易被窃取

          2不占用服务器的资源,但大小有限制

      2)使用包含额外参数(session ID)的URL(即URL重写)

          1需要对所有动态生成的URL进行重写,代码比较繁琐。

          2只能用于动态生成的文档如JSP和servlet,而不能用于Html文档。

          3由于URL可见存在一定风险;

      3)建立数据的隐藏表单字段(Hidden Form Field)

      4)使用内建Session对象

     下面要注意一个问题,“只要浏览器关闭,session就消失”,那么这个论断是否正确呢?对于session除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
     恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

    javax.servlet.http.HttpSession是Java平台对session机制的实现规范。

    HttpSession常见问题
1、session在何时被创建
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。

由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

2、session何时被删除
综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)
3、如何做到在浏览器关闭时删除session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
4、有个HttpSessionListener是怎么回事
你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。
5、存放在session中的对象必须是可序列化的吗
不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。

6、如何才能正确的应付客户端禁止cookie的可能性
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。

7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。
8、如何防止用户打开两个浏览器窗口操作导致的session混乱
这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。

9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。

 

分享到:
评论

相关推荐

    模仿J2EE的session机制的App后端会话信息管理实例

    "模仿J2EE的Session机制的App后端会话信息管理实例" 本文将详细讲解模仿J2EE的Session机制的App后端会话信息管理实例,主要涉及到Session机制、J2EE、Token机制、Cache机制、Redis等知识点。 Session机制是传统...

    J2EE的13种核心技术.pdf

    ### J2EE的13种核心技术详解 #### 引言 Java从最初的浏览器脚本语言逐渐进化成为服务器端开发的主流技术,其中J2EE(Java 2 Platform, Enterprise Edition)平台扮演了至关重要的角色。J2EE由一系列服务、APIs和...

    J2EE的异步消息机制

    **J2EE的异步消息机制详解** J2EE(Java 2 Platform, Enterprise Edition)是一种广泛应用于企业级应用开发的平台,它包含了多种服务、API和容器来支持分布式、多层的应用架构。异步消息机制是J2EE平台中的重要特性...

    j2ee实例 j2ee实例j2ee实例

    J2EE实例还会涉及JMS,这是一种异步通信机制,适用于处理大量并发消息的场景。学习如何设置消息队列和发布/订阅模型,以及如何在Java代码中发送和接收消息,是理解J2EE全貌的关键。 JNDI提供了一个统一的接口来查找...

    j2ee,ex2答案

    通过这个练习,你可以深入理解J2EE中的Session和Cookie机制,提高Web开发能力。《ex2实验报告.doc》可能详细记录了实验步骤、遇到的问题以及解决方案,对于巩固理论知识和实践技能都有很大帮助。而未列出扩展名的...

    j2ee 笔记 j2ee 笔记 j2ee 笔记

    - **Session管理**:服务器端用来跟踪用户会话的一种机制,通常存储在服务器上。 - **Cookie**:客户端用来存储少量数据的一种方式,当浏览器向服务器发送请求时会自动带上对应的Cookie。 示例代码: ```java // ...

    使用tomcat,J2EE同域中跨项目session共享实现

    使用 Tomcat 实现 J2EE 同域中跨项目 Session 共享 Tomcat 是一个流行的 Web 服务器软件,它提供了强大的 Session 管理机制。Session 是一种保存用户状态的机制,允许 Web 应用程序存储和访问用户的状态信息。然而...

    J2EE指南(J2EE tutorial )

    根据功能不同,企业Bean可以分为会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-Driven Beans)三种类型。 - **会话Bean**:负责处理客户端请求,并维护与客户端相关的会话状态。它...

    解决J2EE-session在浏览器关闭后失效问题

    从上述内容可以看出,浏览器关闭后Session失效的原因是因为Session机制采用进程中的cookie来保存sessionid的,当浏览器关闭后进程消失,进程中的cookie消失,那么sessionid也就跟着消失了。因此,如果想使Session在...

    J2EE 经典实例详解6

    **J2EE经典实例详解** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个全面的框架,用于构建、部署和管理分布式多层...J2EE提供了多种安全机制,包括角色基

    J2EE1.5 api文档

    在J2EE 1.5中,EJB主要包括会话bean(Session Beans)、实体bean(Entity Beans)和消息驱动bean(Message-Driven Beans)。EJB 3.0是J2EE 1.5的一部分,引入了注解(Annotations)来简化部署和配置,使得EJB更易用...

    J2EE网上购物系统

    Hibernate提供了Session接口,用于执行CRUD(创建、读取、更新、删除)操作,以及Query和Criteria API,用于查询数据。它的二级缓存和事务管理功能进一步提高了性能和数据一致性。 4. **网上购物系统架构**:一个...

    J2EE架构师手册(j2ee高级进阶,j2ee深层次必备)

    8. **安全性**:J2EE提供了一系列的安全机制,包括身份验证、授权、加密等。理解这些机制并正确配置,能确保应用的安全运行。 9. **部署与测试**:部署策略、热更新和自动化测试工具的使用,也是J2EE架构师需要掌握...

    J2EE面试题集锦(附答案) - J2EE

    - J2EE提供了哪些安全机制?(如:角色基的安全、容器管理的身份验证) - 描述JAAS(Java Authentication and Authorization Service)的工作原理。 9. **性能优化** - 如何进行J2EE应用的性能调优?(如:调整...

    简单的J2EE聊天室

    8. **安全性**:J2EE提供了安全机制,如JAAS(Java Authentication and Authorization Service),用于处理用户认证和授权,保护聊天室免受未经授权的访问。 9. **Web容器**:为了运行J2EE应用,需要一个支持J2EE...

    J2ee平台安全技术架构

    J2EE通过session对象来维护会话状态,同时提供会话固定防护(Session Fixation Protection)以防止会话劫持。会话超时机制可防止未经授权的长时间访问。 5. **防止攻击**:J2EE提供了多种防御措施,以防止SQL注入、...

    基于J2EE实现的商品管理系统

    J2EE提供了如JAAS(Java Authentication and Authorization Service)和SSL/TLS等机制,以保护用户数据的安全。 9. **EJB(可选)**:虽然小型项目可能不涉及,但EJB是J2EE中的高级组件,用于实现业务逻辑,提供...

    j2ee常见面试问题

    以上内容涵盖了J2EE开发中的几个关键知识点,包括事务控制、过滤器、数据库连接池、JSP包含指令以及session管理。理解并掌握这些概念是成为一名合格的J2EE开发人员的基础。在面试中,深入理解和清晰地解释这些概念将...

    J2EE学习笔记(J2ee初学者必备手册)

    J2EE提供了一套全面的安全机制,包括角色、权限、认证和授权,确保只有授权用户才能访问特定资源。 **总结** "J2EE学习笔记(J2ee初学者必备手册)"涵盖了J2EE平台的多个关键组成部分,对于初学者来说,是一份非常...

    J2EE中文版

    EJB有三种类型:Session Beans(会话bean)处理单个客户端请求,Message-driven Beans(消息驱动bean)处理JMS消息,而Entity Beans(实体bean)持久化数据到数据库。 5. **JMS(Java Message Service)**:JMS ...

Global site tag (gtag.js) - Google Analytics