2012-11-15 43 views
1

我必须删除会话的方法获取FacesContext的sessionMap托管bean从其他方面

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

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

THX

回答

1

ExternalContext#getSessionMap()只是HttpSession#get/set/removeAttribute()的抽象。因此,无论您身在servletcontainer(过滤器,servlet,webservice,无论什么地方),只要掌握了实例HttpSession,那么您应该可以使用session.removeAttribute("mySessionBean")

注意,这显然只有在使用相同的HTTP会话JSF应用程序(你提出这个问题的方式所要求的web服务—你似乎不是在所有会话的方式HTTP工作—了解工作表明,这是不案子)。

+0

thx为您的快速回答。 – user1826704

+0

Web服务的http会话不同(Web服务客户端是jsf页面中的一个小程序)。我们使用sessionID来知道哪个applet与Facecontext匹配,所以我们有一个sessionID(String)和两个httpSessions。方法invalidMyBean()位于applet和jsf会话之间的共享对象中。也许有可能从sessionID中检索httpSession对象? – user1826704

+0

将“jsessionid”路径参数添加到URL以让小程序保持相同的HTTP会话。有关的答案,另见http://stackoverflow.com/questions/13194034/accessing-jsf-session-scoped-bean-from-servlet-which-is-called-by-applet-embedde/13194214#13194214 – BalusC

0

我回答自己给一个JSF页面中的小程序工作代码共享相同的HttpSession。该小程序使用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对他有很大的帮助!