1

在我的 JSF 2.0 应用程序中,我有一个会话处理用户 bean,我使用以下代码将 Siteminder 请求标头值设置为会话变量:

FacesContext context = FacesContext.getCurrentInstance();
    Map<String, String> requestHeaderMap = context.getExternalContext().getRequestHeaderMap();
context.getExternalContext().getSessionMap().put(GlobalConstants.SITEMINDER_USERID, userId);
    context.getExternalContext().getSessionMap().put(GlobalConstants.SITEMINDER_USERGROUPS, groups);
    context.getExternalContext().getSessionMap().put(GlobalConstants.SITEMINDER_USERNAME, userName);

从 doFilter 方法下的过滤器中,我正在使用读取会话变量

HttpSession ses = req.getSession();

但 ses 返回 NULL 并且我的过滤器未授权。谁能告诉我这里发生了什么?这并不总是发生,每 10 个用户中就有 1 个发生这种情况。另一个信息是应用程序位于具有 2 个用于负载平衡的托管实例的 weblogic 服务器上。所以我不确定当第一个请求到达一个实例而第二个请求到达另一个实例时会话是否重置为 null

4

1 回答 1

0

可能发生的一件事是您的应用程序未启用共享会话。

http://docs.oracle.com/cd/E15051_01/wls/docs103/webapp/sessions.html

并且由于它的负载平衡,可能一个托管服务器没有由另一台托管服务器启动(在内存上)会话。

配置适当的 weblogic.xml 或 weblogic-application.xml 以通过内存、缓存等启用会话共享。

其他可能性是将您的负载均衡器配置为使用取决于负载均衡器的设备/软件的粘性会话。

http://dev.fyicenter.com/Interview-Questions/JavaScript/What_does_the_term_sticky_session_mean_in_a_web_.html

问候。

于 2013-10-14T20:33:05.970 回答