从其他上下文中检索面孔上下文会话映射



我有一种方法可以删除会话管理的 bean

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

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

感谢

ExternalContext#getSessionMap()只是HttpSession#get/set/removeAttribute()的抽象。因此,无论您在servletcontainer(filter,servlet,webservice等)中的哪个位置,一旦您掌握了具体的HttpSession实例,那么您应该能够在其上使用session.removeAttribute("mySessionBean")

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

我回答自己,为共享同一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的大力帮助!

最新更新