Spring 使用框架组合时获取会话的正确方法

Spring 使用框架组合时获取会话的正确方法,spring,jsf,session,spring-security,jsf-2.2,Spring,Jsf,Session,Spring Security,Jsf 2.2,我有一个web应用程序 SpringFramework 4.0发行版GA Spring Security 3.2.0版本GA JPA2.0由Hibernate 4.2.7最终版提供 莫哈拉2.2.5 PrimeFaces 4.0决赛 PrimeFaces扩展1.1.0 OmniFaces 1.6.3 我有一个关于使用Spring Security时获得会话的问题。假设bean由Spring管理 用户会话可以使用Spring Security获得,如下所示 RequestAttributes cu

我有一个web应用程序

SpringFramework 4.0发行版GA Spring Security 3.2.0版本GA JPA2.0由Hibernate 4.2.7最终版提供 莫哈拉2.2.5 PrimeFaces 4.0决赛 PrimeFaces扩展1.1.0 OmniFaces 1.6.3 我有一个关于使用Spring Security时获得会话的问题。假设bean由Spring管理

用户会话可以使用Spring Security获得,如下所示

RequestAttributes currentRequestAttributes = RequestContextHolder.currentRequestAttributes();
currentRequestAttributes.getAttribute("attributeName", RequestAttributes.SCOPE_SESSION);

甚至

ServletRequestAttributes servletRequestAttributes=(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession session = servletRequestAttributes.getRequest().getSession();
session.getAttribute("attributeName");
或者,如果只是SpringMVC,那么它可以像

request.getSession().getAttibute("attributeName")
在弹簧控制器中

如果用户会话以如下所示的JSF方式公开,会发生什么

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) context.getSession(true);
Object attribute = session.getAttribute("attributeName");
Spring Security是否可以控制会话

使用这样的框架组合时,获得用户会话的正确方法是什么?这或多或少是实验性的


一切免责声明:

您的问题令人困惑。您的问题基本上是询问如何获取会话范围的托管bean,但是您的标题提出了完全不同的问题:获取HTTP会话。让我们假设您确实想知道如何获得会话范围的托管bean:为什么不把它变成一个真正的会话范围的托管bean并注入它呢?然后,所需的有状态会话范围的数据可以存储为该bean的属性。在给定环境中使用会话之后,在我看来,将会话存储到真正的会话范围的托管bean中是正确的方法!您想回答这个问题吗?@您的意思是,存储会话范围的数据。您不能控制/管理HTTP会话本身。服务器已经完成了这项工作。再想一想,你自己还没有开始新的HttpSession。您只是间接地获取它,以便将会话范围的数据作为属性获取/设置,就像JSF和Spring对会话范围的托管bean实例所做的那样。
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) context.getSession(true);
Object attribute = session.getAttribute("attributeName");