使用 HTTP 会话的最佳实践

 
为保护 HTTP 会话启用安全性集成
HTTP 会话由会话标识来识别。会话标识是在运行时生成的一个伪随机数。会话 hijacking 是一个已知攻击 HTTP 会话,当通过网络的所有请求被强制通过安全连接(意味着 HTTPS )时它可被阻止。但并不是每个客户环境中的配置都强制此约束,这是因为 SSL 连接的性能影响。由于这个缓和方式, HTTP 会话易受 hijacking 的攻击,并且因为这个弱点 WebSphere Application Server 有一个选项以紧密结合 HTTP 会话和 WebSphere Application Server 安全性。在 WebSphere Application Server 中启用安全性 ,以使会话以仅允许创建这些会话的用户访问它们的方式来进行保护。
  • 完成后使用javax.servlet.http.HttpSession.invalidate()释放 HttpSession 对象。
HttpSession 对象在 Web 容器中存活到:
    • 应用程序使用 javax.servlet.http.HttpSession.invalidate 方法明确地、程序化地释放它;频繁、程序化的无效是应用程序注销功能的一部分。
    • HttpSession 到期时(缺省 = 1800 秒或 30 分钟),WebSphere Application Server 销毁已分配的 HttpSession。基于会话管理设置,WebSphere Application Server 在内存中仅可以维持一定数量的 HTTP 会话。在分布式会话的情况下,当内存中达到最大高速缓存限制时,会话管理工具把最近最少使用(LRU)的一个会话从高速缓存中除去,为会话腾出空间。
.
  • 避免尝试保存和重新使用每个 servlet JSP 文件外的 HttpSession 对象。
HttpSession 对象是 HttpRequest (您可以仅通过 req.getSession 方法获取它)的功能,其副本仅在 servlet JSP 文件的 service 方法的生存期有效。您无法高速缓存 HttpSession 对象和在 servlet JSP 文件的范围外引用它。
  • 当开发要在 HTTP 会话中存储的新对象时,实施 java.io.Serializable 接口。
此操作允许在使用分布式会话时正确序列化对象。不使用此扩展名,对象无法正确序列化并且会抛出一个错误。示例如下:
public class MyObject implements java.io.Serializable {...}
确保未标记为瞬态的所有实例变量对象是可序列化的。
  • HTTPSession API 不发布会话的事务行为。
分布式 HTTPSession 支持不保证在故障转移方案中或会话亲缘关系中断时属性的事务完整性。使用事务感知的资源(象 Enterprise Java Beans )来保证应用程序所要求的事务完整性。
  • 确保您添加到会话的 Java 对象在正确的类路径中。
如果您把 Java 对象添加到会话,则把那些对象的类文件放入正确的类路径中(如果在企业应用程序中利用跨 Web 模块的共享,则使用应用程序类路径,或者如果使用 Servlet 2.2 兼容的会话共享,则使用 Web 模块类路径)或者放入包括在 WebSphere Application Server 中使用的其他 servlet 的目录下。在会话集群的情况下,此操作应用到此集群中的每个节点。
由于 HttpSession 对象在用户可能访问的 servlet 之间是共享的,所以考虑采用站点范围的命名约定,以避免冲突。
  • 避免在 HttpSession 对象中存储大对象图。
在大多数应用程序中,每个 servlet 只需要全部会话数据的一小部分。然而,通过将数据作为一个大对象存储在 HttpSession 对象中,应用程序迫使 WebSphere Application Server 每次都处理所有数据。
  • 利用会话亲缘关系帮助您获取在 WebSphere Application Server 中的较高的高速缓存命中率。
WebSphere Application Server 具有帮助会话亲缘关系的 HTTP Server 插件中的功能性。插件会从浏览器中读取 cookie 数据(或已编码的 URL ),并且帮助把请求导向到适当的应用程序或克隆(基于已指定的会话密钥)。此功能增加了内存中的高速缓存的使用,并且减少对数据库或另一个 WebSphere Application Server 实例的命中。
  • 会话亲缘关系的最大化使用和避免中断亲缘关系。
正确使用会话亲缘关系可以增强 WebSphere Application Server 的性能。 WebSphere Application Server 环境中的会话亲缘关系是一种最大化地使用会话对象的内存中高速缓存,并减少读数据库或另一个 WebSphere Application Server 实例数的方法。会话亲缘关系通过高速缓存应用程序(用户正在与其进行交互)的服务器实例中的会话对象进行工作。如果应用程序部署在服务器组的多台服务器中,则应用程序可以把用户导向到其中任何一台服务器。如果用户在 server1 开始, 然后过一会进入到 server2 ,则服务器必须把所有会话信息写到外部位置,以便服务器实例( server2 正在其中运行)可以读取该数据库。可以使用会话亲缘关系避免数据库读。使用会话亲缘关系,用户将为第一个请求在 server1 上启动;然后,对于每个后续的请求,用户将被导向回 server1 Server1 必须仅查看高速缓存以获取会话信息; server1 从不需要调用会话数据库以获取该信息。
您可以通过不中断会话亲缘关系改进性能。帮助您避免中断会话亲缘关系的一些建议是:
    • 如果可能,把所有 Web 应用程序组合到单应用程序服务器实例,并使用模型或克隆来提供故障转移支持。
    • 使用多框架 JSP 文件时,为框架页面创建会话,但是不为框架中的页面创建会话。(请参阅此主题中的后续讨论。)
  • 使用多框架页面时,遵循以下准则:
    • 仅在一个框架中或访问任何框架集之前创建会话。例如,假设不存在已与浏览器相关联的会话,并且用户访问多框架 JSP 文件,浏览器发出 JSP 文件的并发请求。因为请求不是任何会话的部分,因此 JSP 文件结束创建多个会话,并且所有 cookie 都发回到该浏览器。该浏览器仅执行到达的最后 cookie。因此,仅客户机可以检索与最后一个 cookie 相关联的会话。建议您在访问利用 JSP 文件的多框架页面前创建会话。
    • 缺省情况下,JSP 文件使用request.getSession(true)方法获取 HTTPSession。因此缺省情况下,如果不存在用于客户机的会话,则 JSP 文件会创建新会话。浏览器中的每个 JSP 页面正在请求一个新会话,但是,只有一个会话用于每个浏览器实例。开发者可以使用<% @ page session="false"%>关闭不访问此会话的 JSP 文件中的自动会话创建。接着,如果页面需要访问该会话信息,开发者可以使用<%HttpSession session = javax.servlet.http.HttpServletRequest.getSession(false); %>以获取由原始会话创建 JSP 文件所创建的已存在的会话。此操作帮助您防止中断框架页面的初始装入上的会话亲缘关系。
    • 仅使用一个框架更新会话数据。使用框架集时,请求并发地进入 HTTP 服务器。仅在一个框架中修改会话数据,以便会话更改不被所建议的并发框架集中的会话更改覆盖。
    • 避免使用多框架 JSP 文件,其中框架指向不同的 Web 应用程序。此操作导致丢失另一个 Web 应用程序创建的会话,因为来自第一个 Web 应用程序的 JSESSIONID cookie 是由第二个 Web 应用程序创建的 JSESSIONID 所覆盖。
  • 当把安全性应用到 servlet JSP 文件(使用带有启用的安全性集成的会话)时,保护所有页面(不只是某些页面)。
当它应用到安全性和会话时,它保护所有页面或什么也不保护。因此,对于部分时间要保护会话状态的访问来说它是没有意义的。当在会话管理工具中启用安全性集成时,创建或访问会话的所有资源必须是受保护的或未受保护的。您不能混合受保护的和未受保护的资源。
仅保护几个页面的问题是,在受保护的页面中创建的会话是用已认证用户的身份创建的。仅同一用户能够访问其他受保护的页面中的会话。要保护这些会话不被未授权的用户使用,不能从未受保护的页面访问它们。当发生来自未受保护的页面的请求时,拒绝访问并且创建 UnauthorizedSessionRequestException 错误。( UnauthorizedSessionRequestException 是运行时异常;它是为您记录的。)
  • 使用手工更新和 sync() 方法或基于时间的写应用程序(读会话数据的)和频繁更新。
写频率时使用 END_OF_SERVICE ,当应用程序使用会话并且任何时候数据从该会话读出或写入时, LastAccess 时间字段会更新。如果使用数据库会话,则产生对数据库的新的写。此活动是性能命中,仅当数据值更新时(不是每个记录的读或写),您可以避免使用 手工更新 选项并且使记录写回数据库。
要使用手工更新,请在会话管理服务中打开它。(请参阅上表以获得位置信息。)另外,应用程序代码必须使用 com.ibm.websphere.servlet.session.IBMSession 类来代替一般的 HttpSession 。在 IBMSession 对象中,存在 sync 方法。此方法告诉 WebSphere Application Server 把会话对象中的数据写到数据库。此活动帮助开发者通过仅在必要时存留会话信息来提高整个性能。
注: 使用手工更新的替代方法是利用时间更新以在不同的时间间隔中保持数据。此操作提供类似手工更新方案的结果。
  • 实施以下各建议以达到高性能:
    • 如果应用程序不频繁更改会话数据,则使用手工更新和 sync 函数(或定时更新)有效地存留会话信息。
    • 尽可能小地保持会话中存储的数据量。简单地使用会话来保持数据,因为有时在会话对象中会存储太多的数据。确定数据存储和性能之间的正确平衡以有效地使用会话。
    • 如果使用数据库会话,则为会话数据库使用专用数据库。避免使用应用程序数据库。这能够帮助您避免争用 JDBC 连接并允许使用更好的数据库性能。
    • 如果使用内存到内存会话,则将分区(组或单个副本)作为您的集群使用会增加大小并缩小减少。
    • 验证您是否具有 WebSphere Application Server 的最新修订包。
  • 利用以下各工具帮助监控会话性能。
    • 运行 com.ibm.servlet.personalization.sessiontracking.IBMTrackerDebug servlet。-要运行此 servlet,必须运行要在 Web 应用程序中运行的 servlet 调用程序。或者,您可以明确地在要运行的应用程序中配置此 servlet
    • 使用与 WebSphere Application Server 一起提供的 WebSphere Application Server 资源分析器,监控 WebSphere Application Server 环境的活动会话和统计信息。
    • 使用数据库跟踪工具,如 DB2 中的“Monitoring”。(请参阅使用的数据库系统的相应文档。)
 

你可能感兴趣的:(WebSphere)