我有一种方法可以删除会话管理的 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’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的大力帮助!