JSF 2.0管理用户



我是从Rails和PHP开始学习Java的,所以我在这里的想法可能会受到影响。我想实现一个类似于我在其他系统中所做的登录系统(我知道你可以使用Java EE的内置属性来管理登录等,我只想了解我如何手动做到这一点并在bean之间共享对象。)

使用rails或php可以很容易地维护一个会话变量,该变量包含登录用户的id。然后,PHP中的全局变量或rails中applicationController上的属性可以与用户对象一起预加载,从而使其在所有控制器/页面中都可用。这样,所有页面/控制器都可以轻松访问用户的登录状态和其他参数。

我不知道如何使用JSF做类似的事情。

我知道如何使用JPA构建用户对象,然后在使用登录表单中的loggin方法登录后,创建一个具有会话范围的托管bean,该bean保存对用户对象的引用

@ManagedBean
@SessionScope
public class LogginController {
// inject persistence context, or use EJB to do actual loading etc
private User currentUser;     //JPA Entity
void loginAction() {
  // action from login form
  // authenticates user and loads user object into currentUser property

我遇到的问题是,尽管包含currentUser属性的托管bean具有会话范围,但我如何在其他托管bean中访问该属性以获取当前用户?托管bean似乎是孤立存在的。

以下代码可接受吗?

@ManagedBean
public class SomeOtherBean {
@ManagedProperty
LoginController loginController;
public void someOtherMethod() {
User myUser = loginController.getCurrentUser();
   //
   // etc

注入bean的类是否也必须具有SessionScope?这是错误的方法吗?我是否需要使用底层Servlet上下文手动设置会话,以便在其他bean中可以访问用户(即,在会话中保存登录用户的id,然后在访问不同bean中的用户id会话变量后重新加载用户)?

我做错了吗?有没有一种更容易的方法让我错过。

以下代码可接受吗

是(假设它是伪的;在实际代码中,它应该是private属性,并且应该像指定@ManagedProperty("#{loginController}")一样指定托管属性值,并至少提供一个setter方法)。


注入bean的类是否也必须具有SessionScope

不一定。它完全可以是请求或视图范围的bean,但不能是应用程序范围的bean(这会导致异常)。至少,在选择bean作用域时应该非常小心。不要为它所包含的数据选择太大的范围。另请参阅如何选择正确的bean作用域?。

最新更新