Java 有没有办法在JSF应用程序中使用Spring注入HttpSession?

Java 有没有办法在JSF应用程序中使用Spring注入HttpSession?,java,spring,jsf-2,Java,Spring,Jsf 2,我有一个用JSF2编写的web应用程序,它使用Spring。我需要创建一个bean,它是JSFHTTP会话的包装器,并在内部使用它。在我看来,将HttpSession对象注入到该bean的定义中并将该bean的范围限定到会话是合乎逻辑的。但是,我找不到在context.xml文件中定义注入的方法。有没有可能做到这一点,会不会适得其反,还有没有更好的办法?我想要的只是在bean中拥有当前会话。如果有一个静态方法来获取会话(类似于ASP.NET中的HttpContext.Current.sessio

我有一个用JSF2编写的web应用程序,它使用Spring。我需要创建一个bean,它是JSFHTTP会话的包装器,并在内部使用它。在我看来,将HttpSession对象注入到该bean的定义中并将该bean的范围限定到会话是合乎逻辑的。但是,我找不到在context.xml文件中定义注入的方法。有没有可能做到这一点,会不会适得其反,还有没有更好的办法?我想要的只是在bean中拥有当前会话。如果有一个静态方法来获取会话(类似于ASP.NET中的HttpContext.Current.session),它也会很有用。提前感谢。

我不确定Spring部分(我不使用它,我只使用标准的Java EE 6 API),但您可以通过以下方式在JSF上下文中静态获得
HttpSession

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
@RequestMapping("/myhandler.do")
public String myHandler(HttpSession session) {
    ...foo...
}

您可以在bean的(post)构造函数中执行此操作。

如果您使用的是Spring管理的处理程序方法,只需将
HttpSession
对象添加到处理程序的方法签名中,Spring就会自动注入它,如下所示:

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
@RequestMapping("/myhandler.do")
public String myHandler(HttpSession session) {
    ...foo...
}

谢谢,但我的目的是在会话中包装某些功能,而不显式地使用它——在我的例子中,我正在编写一个身份验证bean,它将使用用户名和密码加载用户并将其放入会话,并在用户登录时公开该使用,而不公开实际的会话对象。我认为下面建议的静态访问将更适用于我的情况。不过,了解到我可以使用'@RequestMapping'注释传递会话还是很有用的。谢谢,我想这是ASP.NET的HttpContext.Current.session的JSF替代方案。它对我来说工作得很好,甚至更好——我不需要将bean的范围限定到会话,因为它总是静态地获取它,所以我将拥有bean的单个实例。当然,我不能在会话之外保留任何与当前会话内容相关的状态,这样bean就会保持某种无状态。我必须承认,这个要求对我来说没有多大意义。我认为一个简单的会话范围的托管bean就足够了。将会话数据存储在那里,而不是试图包装
HttpSession
;换句话说,bean实现了一个接口并将被这个接口公开,这个接口不知道也不能依赖于web技术和HTTP会话。