【发布时间】:2014-07-21 10:22:14
【问题描述】:
我在 Spring -MVC 项目中工作,该项目部署在 Weblogic 服务器中,它配置了 2 个集群。当请求从一个集群发送到另一个集群时,我们收到"401 (Unauthorized)" 错误。
但它适用于某些请求并有时会导致此错误。
知道为什么会这样吗?
【问题讨论】:
标签: java weblogic weblogic-10.x
我在 Spring -MVC 项目中工作,该项目部署在 Weblogic 服务器中,它配置了 2 个集群。当请求从一个集群发送到另一个集群时,我们收到"401 (Unauthorized)" 错误。
但它适用于某些请求并有时会导致此错误。
知道为什么会这样吗?
【问题讨论】:
标签: java weblogic weblogic-10.x
如果您将安全性委托给 Servlet 容器并将您的应用程序部署到 2 个不同的集群(ClusterA、ClusterB),默认情况下您将拥有两个不同的会话 SessionA 和 SessionB(具有相同的 cookie 名称,JSESSIONID)。如果您没有会话关联性并且您的请求从 ClusterA 跳转到 ClusterB,您的 SessionA(带有主题)将在 ClusterB 上无效。
如果您正在寻找两个集群拓扑的最大可用性,请考虑将 HTTP 会话状态委托给 Coherence(请参阅 Coherence*Web at http://docs.oracle.com/middleware/1212/coherence/COHCW/cweb_wls.htm#CHDDGJHJ)。
使用此拓扑,您可以在部署在不同集群(甚至不同的 WebLogic Server 域和/或不同的应用程序服务器)上的许多应用程序之间共享会话。
【讨论】:
您是否启用了内存复制(默认禁用)? ( weblogic.xml 描述符中的元素。如果没有,请使用以下命令启用它:
<session-descriptor>
<persistent-store-type>replicated_if_clustered</persistent-store-type>
</session-descriptor>
当第一个请求到达 ClusterA 中的任何托管服务器时,它会创建一个 SessionID(检查您浏览器中的 JSESSIONID cookie)。
您如何在两个集群之间平衡您的请求(硬件负载平衡器或 Web 服务器 + 代理插件)
如何保持集群亲和性?
如果没有集群关联,ClusterA 中任何托管服务器处理的所有请求都可以访问会话状态(启用内存复制时由 WLS 集群内部复制),但如果集群关联失败并且请求(最初由 ClusterA 提供的服务器)由集群 B 中的任何托管服务器处理,Servlet 容器将找不到您的 cookie 与 ClusterB 识别的任何 HTTSession,它将失败并创建一个新 Session(检查浏览器中的 cookie)。
【讨论】: