从其他上下文中检索FacesContext sessionMap

时间:2012-11-15 14:22:17

标签: jsf-2

我有一个删除会话管理bean的方法

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

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

THX

2 个答案:

答案 0 :(得分:1)

ExternalContext#getSessionMap()只是HttpSession#get/set/removeAttribute()的抽象。因此无论你在servletcontainer(filter,servlet,webservice,无论如何)中,只要你掌握了具体的HttpSession实例,那么你应该可以使用session.removeAttribute("mySessionBean")

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

答案 1 :(得分:0)

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

在JSF页面中:

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

在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的大力帮助!