2

我有一种删除会话托管 bean 的方法

public void invalidMyBean()
{
    final Map<String, Object> sessionMap = FaceContext.getCurrentInstance().getExternalContext().getSessionMap();
    sessionMap.remove("mySessionBean");
}

invalidMyBean() 也从 Web 服务调用。在这种情况下 FaceContext.getCurrentInstance() 为空,我无法删除我的 bean。我试图将 sessionMap 作为一个字段存储在我的类中,但是从这个对象中删除是行不通的。有没有办法从 faceContext 外部检索 sessionMap ?

谢谢

4

2 回答 2

2

ExternalContext#getSessionMap()只是 的抽象HttpSession#get/set/removeAttribute()。因此,无论您在 servletcontainer(过滤器、servlet、webservice 等什么)中,一旦您掌握了具体HttpSession实例,就应该能够使用session.removeAttribute("mySessionBean")它。

请注意,这显然仅在使用与 JSF 应用程序相同的 HTTP 会话请求 Web 服务时才有效(您提出这个问题的方式——您似乎根本不了解 HTTP 会话的工作方式——表明情况并非如此)。

于 2012-11-15T14:32:51.977 回答
0

我回答自己在共享相同 HttpSession 的 JSF 页面中提供小程序的工作代码。小程序使用 JAX-WS 与服务器上的 Web 服务通信。

在 JSF 页面中:

<applet ..>
<param name="commonSessionId" value="#{session.id}" />
Distance Sensor [Your browser doesn&rsquo;t seem to support Java applets.]
</applet>

在小程序 init() 中:

@Override
public void init()
{
    ...
    commonSessionId = getParameter("commonSessionId");
    port = service.getWsAppletPort();
    final Map<String, Object> map = new HashMap<String, Object>();
    map.put("Cookie", Collections.singletonList("JSESSIONID=" + commonSessionId));
    final Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext();
    requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, map);
    requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
}

再次感谢 BalusC 的大力帮助!

于 2012-11-15T22:33:19.597 回答