我有一个删除会话管理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
答案 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’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的大力帮助!