1

我有一个关于会话超时和 JSF 2 的问题。我的异常处理程序完全按照每个人都喜欢的方式工作,但我需要将一个值传递给登录页面。例如,我有一个典型的登录 URL - www.acme.com/?companyId=company14,它反过来为 company14 提供了他们自己的自定义登录页面(使用他们的徽标)。在他们进入应用程序并完成一些工作后,他们会阅读一封电子邮件或 2 封电子邮件。会话超时并显示会话超时页面,指示用户单击“确定”以继续登录页面。如何将 ?companyId=company14 添加到 URL?我可以使用以下方法在异常处理程序中对其进行硬编码:

requestMap.put("companyId", "company14");

然后在 viewExpired.xhtml 页面上引用它:

    <h:panelGrid id="expiredGrid" columns="1">
        <f:facet name="header">
            <h:outputText id="outExpireMsg" value="Your session has expired"/>
        </f:facet>
        <h:outputText id="outReqMessage" value="Reloading the page will require login."/>
        <h:outputText value=""/>
        <h:button id="okButton" type="submit" value="Ok" outcome="login?companyId=#{companyId}"/>
    </h:panelGrid>

问题是我似乎无法将 companyId 保存在任何地方,而不会被会话超时清除。我想使用这个值在异常处理程序中设置 companyId。有任何想法吗?

4

1 回答 1

0

您可以在登录时将其设置为 cookie。

Map<String, Object> properties = new HashMap<String, Object>();
properties.put("path", "/"); 
externalContext.addResponseCookie("companyId", companyId, properties);

然后你可以按如下方式抓取它:

Cookie cookie = (Cookie) externalContext.getRequestCookieMap().get("companyId");

if (cookie != null) {
    String companyId = cookie.getValue();
}

请注意,当服务器端会话过期时,这不会过期。这仅在浏览器关闭时过期。

于 2012-06-19T21:14:29.957 回答